无法从同一个 GCloud 项目中的 Laravel 5.5 应用程序连接到 MYSQL 实例
Cannot connect to a MYSQL instance from my Laravel 5.5 app both in the same GCloud project
我正在尝试从同一 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,
]
请注意:
- 我的 API 已启用。
- 已启用计费。
这个你要留着,很重要:
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
正如Caner所说,你必须保留app.yaml
的beta_settings
部分,否则数据库连接将无法正常工作,我不认为云SQL 代理可执行文件将包含在部署的应用程序中。
除此之外,您还应确保用于访问数据库的帐户具有 @cloudsqlproxy~%
的正确授权。
我已经(成功地)尝试部署默认 Laravel 网站(通过 laravel new
创建)。以下片段适用于最新版本的 Laravel(5.6 版),但根据我的测试,这对于 5.5 应该几乎相同。
这是我的 app.yaml
文件。您将用于访问数据库的用户应该在 Cloud SQL 实例中获得 @cloudsqlproxy~%
的授权。根据我的实验,云 SQL 代理在 AEF 计算实例中以 Unix 套接字模式运行,所以我的猜测是,在一天结束时,无论您在 DB_HOST 中设置什么都不重要。最后,非常小心 app.yaml
文件中的空格(实际空格,而不是制表符),并确保您没有使用一些奇怪的引号字符。再次,在 beta_settings
中包含 cloud_sql_instances
:
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"
这是我在 config/database.php
中的 mysql
部分。请注意,我没有改变任何东西,这些是 5.6 的默认值:
'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,
]
最后,这里是 composer.json
文件的 post-install-cmd
部分。在 5.5 中,您还必须在 之前添加 php artisan optimize
chmod
命令:
"post-install-cmd": [
"Illuminate\Foundation\ComposerScripts::postInstall",
"chmod -R 755 bootstrap\/cache"
]
检查您应用程序的部署设置中是否有任何内容与我在此处发布的内容不同! gcloud app deploy
的解析错误很奇怪;只要您正确格式化文件并拥有 gcloud up-to-date,它应该可以正常工作。
我正在尝试从同一 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,
]
请注意:
- 我的 API 已启用。
- 已启用计费。
这个你要留着,很重要:
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
正如Caner所说,你必须保留app.yaml
的beta_settings
部分,否则数据库连接将无法正常工作,我不认为云SQL 代理可执行文件将包含在部署的应用程序中。
除此之外,您还应确保用于访问数据库的帐户具有 @cloudsqlproxy~%
的正确授权。
我已经(成功地)尝试部署默认 Laravel 网站(通过 laravel new
创建)。以下片段适用于最新版本的 Laravel(5.6 版),但根据我的测试,这对于 5.5 应该几乎相同。
这是我的 app.yaml
文件。您将用于访问数据库的用户应该在 Cloud SQL 实例中获得 @cloudsqlproxy~%
的授权。根据我的实验,云 SQL 代理在 AEF 计算实例中以 Unix 套接字模式运行,所以我的猜测是,在一天结束时,无论您在 DB_HOST 中设置什么都不重要。最后,非常小心 app.yaml
文件中的空格(实际空格,而不是制表符),并确保您没有使用一些奇怪的引号字符。再次,在 beta_settings
中包含 cloud_sql_instances
:
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"
这是我在 config/database.php
中的 mysql
部分。请注意,我没有改变任何东西,这些是 5.6 的默认值:
'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,
]
最后,这里是 composer.json
文件的 post-install-cmd
部分。在 5.5 中,您还必须在 之前添加 php artisan optimize
chmod
命令:
"post-install-cmd": [
"Illuminate\Foundation\ComposerScripts::postInstall",
"chmod -R 755 bootstrap\/cache"
]
检查您应用程序的部署设置中是否有任何内容与我在此处发布的内容不同! gcloud app deploy
的解析错误很奇怪;只要您正确格式化文件并拥有 gcloud up-to-date,它应该可以正常工作。