Symfony3 на Google App Engine Flexible не может подключиться к Google Cloud SQL MySQL

Я не могу настроить свой проект Symfony 3 на Google App Engine Flexible для подключения к Google Cloud SQL (MySQL, 2-го поколения).

Начнем с этих примеров

https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/fflexible/symfony

https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/fflexible/cloudsql-mysql.

Я создал Google App Engine и Google Cloud SQL (MySQL, 2-го поколения), оба на europe-west3. Я тестировал эти примеры на своем GAE, и оба они работали нормально.

Затем я создал новый, очень простой проект Symfony 3.3 с нуля. После создания (только с экраном приветствия и надписью «Ваше приложение готово. Вы можете начать работу над ним по адресу: / app /») я развернул его на моем GAEflex, и он отлично работает.

После этого я добавил одну простую сущность и дополнительный контроллер для этого. Это отлично работает, как и должно, при запуске Googles cloud_sql_proxy и встроенного веб-сервера Symfony «php bin / console server: run». Он легко читает и записывает в Cloud SQL и из него.

Но, что бы я ни пробовал, я всегда получаю сообщение «Connection Refused» для одной (или другой, в зависимости от моего состояния экспериментов) команд из «symfony-scripts» «post-install-cmd» в моем composer.json .

Вывод "развертывание бета-приложения $ gcloud" (отрывок)

...
Step #1: Install PHP extensions...
Step #1: Running composer...
Step #1: Loading composer repositories with package information
...
Step #1:     [Doctrine\DBAL\Exception\ConnectionException]
Step #1:     An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused
Step #1:
Step #1:
Step #1:     [Doctrine\DBAL\Driver\PDOException]
Step #1:     SQLSTATE[HY000] [2002] Connection refused
Step #1:
Step #1:
Step #1:     [PDOException]
Step #1:     SQLSTATE[HY000] [2002] Connection refused
...

parameters.yml (отрывок)

parameters:
    database_host: 127.0.0.1
    database_port: 3306
    database_name: gae-test-project
    database_user: root
    database_password: secretpassword

config.yml (отрывок)

doctrine:
    dbal:
        driver: pdo_mysql
        host: '%database_host%'
        port: '%database_port%'
        unix_socket: '/cloudsql/restof:europe-west3:connectionname'
        dbname: '%database_name%'
        user: '%database_user%'
        password: '%database_password%'
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci

composer.json (отрывок)

"require": {
    "php": "^7.1",
    "doctrine/doctrine-bundle": "^1.6",
    "doctrine/orm": "^2.5",
    "incenteev/composer-parameter-handler": "^2.0",
    "sensio/distribution-bundle": "^5.0.19",
    "sensio/framework-extra-bundle": "^3.0.2",
    "sensio/generator-bundle": "^3.0",
    "symfony/monolog-bundle": "^3.1.0",
    "symfony/polyfill-apcu": "^1.0",
    "symfony/swiftmailer-bundle": "^2.3.10",
    "symfony/symfony": "3.3.*",
    "twig/twig": "^1.0||^2.0"
},
"require-dev": {
    "symfony/phpunit-bridge": "^3.0"
},
"scripts": {
    "symfony-scripts": [
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
    ],
    "post-install-cmd": [
        "chmod -R ug+w $APP_DIR/var",
        "@symfony-scripts"
    ],
    "post-update-cmd": [
        "@symfony-scripts"
    ]
},

app.yml (полный)

service: default
runtime: php
env: flex

runtime_config:
  document_root: web

env_variables:
  SYMFONY_ENV: prod
  MYSQL_USER: root
  MYSQL_PASSWORD: secretpassword
  MYSQL_DSN: mysql:unix_socket=/cloudsql/restof:europe-west3:connectionname;dbname=gae-test-project
  WHITELIST_FUNCTIONS: libxml_disable_entity_loader

#[START cloudsql_settings]
# Use the connection name obtained when configuring your Cloud SQL instance.
beta_settings:
    cloud_sql_instances: "restof:europe-west3:connectionname"
#[END cloudsql_settings]

Имейте в виду, что я добавил или изменил только те строки, которые мне советовали примеры и документация.

Что я делаю не так? Оба примера работают нормально, проект Symfony, подключающийся к БД через работающий cloud_sql_proxy, работает нормально, когда я пытаюсь получить доктрину для подключения к CloudSQL изнутри GAEflex, я не получаю соединения.

Может ли кто-нибудь заметить ошибку новичков, которую я мог совершить? У кого-нибудь была такая проблема и, может быть, я забыл ту или иную настройку с GAE или CloudSQL? Может ли кто-нибудь указать мне на репозиторий работающего проекта Symfony3 / Doctrine, который использует GAEFlex и CloudSQL?

Я застрял, так как не могу найти обновленную документацию о том, как запустить эту, довольно очевидную комбинацию. Любая помощь приветствуется!

Приветствия / Карстен


person Carsten Germer    schedule 08.11.2017    source источник
comment
Я не знаком с Symfony, но что произойдет, если вы удалите строки хоста / порта из config.yml? Сообщение об ошибке (в соединении отказано) предполагает, что он пытается подключиться через TCP, а не через сокет UNIX.   -  person Vadim    schedule 09.11.2017
comment
Вы правы насчет подсказки об отказе в соединении для TCP, но нет, тогда он говорит: SQLSTATE [HY000] [2002] Нет такого файла или каталога. Я уже упоминал, что обдумывал это уже несколько дней? После того, как я не смог найти пример, я волей-неволей попробовал все, что мог придумать, за исключением катания головой по клавиатуре. Вот почему я спросил, может ли кто-нибудь точно указать на мою ошибку или проект, который работает.   -  person Carsten Germer    schedule 09.11.2017
comment
Можете ли вы дважды проверить, включен ли Cloud SQL API? См. Пункт 2 в разделе Перед тем, как начать: cloud.google.com / appengine / docs / flexible / php / using-cloud-sql.   -  person Vadim    schedule 10.11.2017
comment
Вадим ^ _ ^ пожалуйста.   -  person Carsten Germer    schedule 13.11.2017


Ответы (1)


Я нашел это. Я прочитал этот пост Гибкий env: post-deploy-cmd из composer.json он не выполняется, что дало две интересных информации.

  1. App Engine Flex для PHP, больше не работает post-deploy-cmd
  2. просто используйте post-install-cmd как замену, если вам не нужно подключение к БД.

Итак, во время развертывания просто нет подключения к базе данных / сокета! Вот почему Google представил (нестандартный) post-deploy-cmd, который, к сожалению, вызвал некоторые другие проблемы, поэтому они снова удалили его. Облом.

Фактически, на сегодняшний день нельзя использовать что-либо, использующее базу данных, в post-install-cmd.

В приведенном выше случае я просто изменил

composer.json (отрывок)

"scripts": {
    "symfony-scripts": [
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
    ],
    "pre-install-cmd": [
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
    "post-install-cmd": [
        "chmod -R ug+w $APP_DIR/var",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
    ],
    "post-update-cmd": [
        "@symfony-scripts"
    ]
},

И все работает нормально ...

Я не уверен насчет внутренней сущности installAssets, и если я все же достигну изначально задуманного эффекта, когда перенесу его в режим предварительной установки, но, ну, это работает для очень простого примера приложения ... В ближайшие дни я собираюсь поработать над переносом этого в мое более сложное приложение и посмотреть, смогу ли я заставить это работать.

Дальнейшее обсуждение, скорее всего, будет окончено в сообществе Google Cloud Platform.

Всем привет!

person Carsten Germer    schedule 13.11.2017