我正在尝试从同一个Gcloud项目中的PHP Laravel 5.5应用程序连接到存储在GCloud中的数据库。
部署我的应用时,主页显示效果不错,但是当我尝试连接用户时,我会收到浏览器上显示的这些错误:
我遵循了本教程:Run Laravel on Google App Engine Flexible Environment
我的app.yaml文件如下所示:
runtime: php
env: flex
runtime_config:
document_root: public
skip_files:
- .env
env_variables:
APP_LOG: errorlog
APP_DEBUG: true
APP_KEY: MY-APP-KEY
STORAGE_DIR: /tmp
CACHE_DRIVER: file
SESSION_DRIVER: file
DB_CONNECTION : mysql
DB_HOST: localhost
DB_PORT: 3306
DB_DATABASE: MY DB NAME
DB_USERNAME: USERNAME
DB_PASSWORD: PASSWORD
DB_SOCKET: "/cloudsql/MY-PROJECT-NAME:us-central1:MY-SQL-INSTANCE-NAME"
在教程中,他们说这个:
beta_settings:
# for Cloud SQL, set this value to the Cloud SQL connection name,
# e.g. "project:region:cloudsql-instance"
cloud_sql_instances: "YOUR_CLOUDSQL_CONNECTION_NAME"
但我删除了它,因为当我运行命令 gcloud app deploy 时,我收到此错误:解析文件时出错:app.yaml在第xx行xx
在我的 database.php 文件中,我试过这个:
'mysql' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'database' => 'DBNAME',
'username' => 'USERNAME',
'password' => 'PASWORD',
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
]
这个(提供 unix_socket ):
'mysql' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'database' => 'DBNAME',
'username' => 'USERNAME',
'password' => 'PASSWORD',
'unix_socket' => env('DB_SOCKET', '/cloudsql/MY-PROJECT-NAME:us-central1:MY-SQL-INSTANCE-NAME'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
]
请注意:
答案 0 :(得分:0)
你必须保持这一点,这是至关重要的:
beta_settings:
# for Cloud SQL, set this value to the Cloud SQL connection name,
# e.g. "project:region:cloudsql-instance"
cloud_sql_instances: "YOUR_CLOUDSQL_CONNECTION_NAME"
将“YOUR_CLOUDSQL_CONNECTION_NAME”替换为您从以下命令中看到的连接名称:
gcloud sql instances describe YOUR_INSTANCE_NAME
此外,我不确定这是否是复制粘贴问题,但在
之前您的配置中缺少空格runtime_config:
document_root: public # <- missing spaces here
答案 1 :(得分:0)
就像Caner所说,你必须保留beta_settings
的{{1}}部分,否则数据库连接将无法正常工作,因为我认为Cloud SQL Proxy可执行文件不会包含在部署的应用程序中。
除此之外,您还应确保您用于访问数据库的帐户具有app.yaml
的正确授权。
我(已成功)尝试部署默认的Laravel网站(通过@cloudsqlproxy~%
创建)。以下片段适用于最新版本的Laravel(5.6版),但从我的测试来看,这应该与5.5的工作方式基本相同。
这是我的laravel new
文件。您将用于访问数据库的用户应在Cloud SQL实例中为app.yaml
授予权限。从我的实验来看,Cloud SQL Proxy在Unix套接字模式的AEF计算实例中运行,所以我的猜测是,在一天结束时,无论你在DB_HOST中设置什么都不重要。最后,使用@cloudsqlproxy~%
文件中的空格(实际空格,而不是制表符)非常小心,并确保您没有使用某些奇怪的引号字符。再次,在app.yaml
中加入cloud_sql_instances
:
beta_settings
这是runtime: php
env: flex
runtime_config:
document_root: public
# Ensure we skip ".env", which is only for local development
skip_files:
- .env
env_variables:
# Put production environment variables here.
APP_LOG: errorlog
APP_KEY: INSERT_APPKEY_HERE
STORAGE_DIR: /tmp
CACHE_DRIVER: database
SESSION_DRIVER: database
DB_HOST: 127.0.0.1
DB_DATABASE: laravel
DB_USERNAME: INSERT_USERNAME
DB_PASSWORD: INSERT_PASSWORD
DB_SOCKET: "/cloudsql/project-name:region:cloudsql-instance-name"
beta_settings:
cloud_sql_instances: "project-name:region:cloudsql-instance-name"
的{{1}}部分。请注意,我没有更改任何东西,这些是5.6的默认值:
mysql
最后,这是config/database.php
文件的'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
]
部分。在5.5中,您还需要在<{strong> post-install-cmd
命令之前添加composer.json
:
php artisan optimize
检查您应用的部署设置中是否有任何与我在此处发布的内容不同的内容!来自chmod
的解析错误非常奇怪;只要您正确格式化文件并使gcloud保持最新,它就可以正常运行。