Невозможно подключиться к экземпляру MYSQL из моего приложения Laravel 5.5 в одном проекте GCloud

Я пытаюсь подключиться к своей базе данных, хранящейся в GCloud, из приложения PHP Laravel 5.5 в том же проекте Gcloud.

Когда я развертываю свое приложение, домашняя страница отображается хорошо, но, когда я пытаюсь подключить пользователя, я получаю следующие ошибки в браузере:

PDOException
QueryException

Я следовал этому уроку: Запустите Laravel в гибкой среде Google App Engine

Мой файл 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.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. Биллинг включен.

3

Решение

Так же, как сказал Канер, вы должны сохранить beta_settings часть app.yamlиначе соединение с базой данных не будет работать, так как, я не думаю, что исполняемый файл Cloud SQL Proxy будет включен в развернутое приложение.

Помимо этого, вы также должны убедиться, что учетная запись, которую вы используете для доступа к базе данных, имеет правильные права на @cloudsqlproxy~%,


Я (успешно) попытался развернуть веб-сайт Laravel по умолчанию (созданный с помощью laravel new). Следующие фрагменты относятся к последней версии Laravel (версия 5.6), но из моего тестирования это должно работать примерно так же для 5.5.

Вот мой app.yaml файл. Пользователь, которого вы будете использовать для доступа к базе данных, должен иметь гранты для @cloudsqlproxy~% в экземпляре Cloud SQL. Исходя из моих экспериментов, Cloud SQL Proxy работает в AEF Compute Instances в режиме сокетов Unix, поэтому я предполагаю, что в конечном итоге все, что вы установили в DB_HOST, не должно иметь большого значения. Наконец, быть очень осторожно с пробелами (фактические пробелы, а не табуляции) в 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"

Вот мой mysql раздел config/database.php, Имейте в виду, я ничего не изменил, это значения по умолчанию для 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,
]

Наконец, вот post-install-cmd раздел composer.json файл. В 5.5 также нужно добавить php artisan optimize до chmod команда:

"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"chmod -R 755 bootstrap\/cache"]

Проверьте, есть ли что-нибудь в настройках развертывания вашего приложения, которое отличается от того, что я публикую здесь! Ошибка разбора от вашего gcloud app deploy очень странно; пока вы правильно форматируете файл и используете gcloud, он должен работать без проблем.

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
0

По вопросам рекламы [email protected]