Я пытаюсь подключиться к своей базе данных, хранящейся в GCloud, из приложения PHP Laravel 5.5 в том же проекте Gcloud.
Когда я развертываю свое приложение, домашняя страница отображается хорошо, но, когда я пытаюсь подключить пользователя, я получаю следующие ошибки в браузере:
Я следовал этому уроку: Запустите 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,
]
ОБРАТИТЕ ВНИМАНИЕ, ЧТО:
Так же, как сказал Канер, вы должны сохранить 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, он должен работать без проблем.
Вы должны сохранить это, это жизненно важно
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