我无法让我在Google App Engine Flexible上的Symfony 3项目连接到Google Cloud SQL(MySQL,2。生成)。
从这些例子开始
https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/flexible/symfony
https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/flexible/cloudsql-mysql
我创建了一个谷歌应用引擎和一个谷歌云SQL(MySQL,2。Generation),两者都在欧洲西部3。我在GAE上测试了这些例子,结果都很好。
然后,我从头开始创建了一个新的、非常简单的Symfony 3.3项目。创建后(只有欢迎屏幕和"您的应用程序现在已经准备好了。您可以在:/app/开始处理它"),我将其部署到我的GAEflex中,它运行良好。
之后,我添加了一个简单的实体和一个额外的控制器。当启动Googlecloud_sql_proxy和Symfony内置的Web服务器"php-bin/console-server:run"时,这应该很好。它从云SQL中读写,一切都很简单。
但是,无论我尝试了什么,我的composer.json中的"symfony scripts"post-install cmd"中的一个(或另一个,取决于我的实验状态)命令总是会得到"拒绝连接"。
"$gcloud测试版应用程序部署"输出(摘录)
...
Step #1: Install PHP extensions...
Step #1: Running composer...
Step #1: Loading composer repositories with package information
...
Step #1: [DoctrineDBALExceptionConnectionException]
Step #1: An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused
Step #1:
Step #1:
Step #1: [DoctrineDBALDriverPDOException]
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连接到DB也很好,当我试图从GAEflex中获得连接到CloudSQL的原则时,我没有得到任何连接。
有人能发现我可能犯的新手错误吗?有人遇到过这个问题吗?也许我忘记了GAE或CloudSQL的一个或另一个设置?有人能给我指一个使用GAEFlex和CloudSQL的Symfony3/Doctrine项目的存储库吗?
我被卡住了,因为我找不到任何关于如何运行这个非常明显的组合的最新文档。非常感谢您的帮助!
干杯/卡斯滕
我找到了。我读了这篇文章Flexible env:post-deploy cmd from composer.json它没有被执行,这产生了两个有趣的信息。
- App Engine Flex for PHP,不再运行
post-deploy-cmd
- 只需使用
post-install-cmd
作为替换插件,除非您需要DB连接
因此,在部署过程中,根本没有可用的数据库连接/套接字!这就是为什么谷歌推出了(非标准)post-deploy-cmd
,不幸的是,它似乎造成了其他一些麻烦,所以他们再次将其删除。真倒霉
实际上,到目前为止,在安装后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
的内部结构,也不确定当我将其移动到预安装时是否仍然达到了最初的预期效果,但是,好吧,它适用于一个非常简单的示例应用程序。。。在接下来的几天里,我将把它移植到我更复杂的应用程序中,看看我是否能让它发挥作用。
进一步的讨论很可能会在谷歌云平台社区上结束
为大家干杯!