无法在同一个GCloud项目

时间:2018-03-18 18:49:35

标签: php google-app-engine google-compute-engine laravel-5.5 gcloud

我正在尝试从同一个Gcloud项目中的PHP Laravel 5.5应用程序连接到存储在GCloud中的数据库。

部署我的应用时,主页显示效果不错,但是当我尝试连接用户时,我会收到浏览器上显示的这些错误:

PDOException QueryException

我遵循了本教程: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. 已启用结算功能。

2 个答案:

答案 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保持最新,它就可以正常运行。