无法从同一个 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,
        ]

请注意:

  1. 我的 API 已启用。
  2. 已启用计费。

这个你要留着,很重要:

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.yamlbeta_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,它应该可以正常工作。