Laravel5.5をGoogle App Engineで動かす
我正在撰写这个时候,还是Beta版,但终于在Google App Engine的标准环境中可以使用PHP7.2,并且可以使用最新的Laravel LTS版本5.5。
然而,当你真正开始使用时,会遇到一些问题,所以我想总结一下这些要点。顺便一提,我也会涉及一点Laradock。
由于此文章涉及不稳定的环境,因此其内容可能会迅速变得不准确。敬请谅解。
建立开发环境
我們將使用 Laradock 建立開發環境。關於 Laradock 的安裝方法和使用方式等,請參閱官方文件。在執行 docker-compose up -d nginx mysql 前,請添加以下設定。
MySQL是一种开源的关系型数据库管理系统。
为了在使用docker-compose exec mysql mysql -u homestead -psecret命令查看表内容时避免出现乱码问题,在laradock/mysql/my.cnf文件中添加以下设置。
[mysql]
default-character-set=utf8mb4 #これを追記
谷歌云软件开发工具包
为了在Laradock中使用gcloud命令并进行部署到GAE,需要安装Google Cloud SDK。进入工作空间并手动执行命令是没有意义的。让我们在workspace/Dockerfile中添加以下内容。
# ここから
###########################################################################
# Google Cloud SDK:
###########################################################################
RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
apt-get update -y && apt-get install google-cloud-sdk -y
# ここまで追記
###########################################################################
# Check PHP version:
###########################################################################
顺便说一句,关于部署的详细信息,我们可以通过Composer轻松地将其整合到Google App Engine的部署中。
设定等
Google云SDK的身份验证
执行 docker-compose up -d nginx mysql 命令后,确保容器成功启动后,请按照以下步骤完成认证,不要忘记:
$ docker-compose exec --user=laradock workspace bash
laradock@4372800326ab:/var/www$ gcloud auth login
中国語でネイティブに以下を書き換えます。1つのオプションのみ必要です:
使用GaeSupportLaravel进行安装
为了使GAE能够使用Laravel,我们将使用a1comms/GaeSupportLaravel。
在README中,我们将详细解释。
"require": {
"a1comms/gae-support-laravel": "~5.4"
}
在composer.json中写着要添加上述内容,但在Packagist上看起来没有5.4版本…?(截至2018年11月11日)另外,5.1版本似乎是为Laravel 5.1准备的。
如果要使用5.5版本,请按以下方式添加。
"require": {
"a1comms/gae-support-laravel": "dev-php72-laravel55"
}
对于 bootstrap/app.php、config/app.php 和 composer.json 的修改,请按照 README 文件进行操作,没有问题。
环境变量
如果不在.env文件中将SESSION_DRIVER的值更改为”gae”,则无法使用会话。为什么README上没有写这么重要的事情呢…
#SESSION_DRIVER=file
SESSION_DRIVER=gae
会话不是存储在Memcache中,而是以种类为”sessions”的方式存储在CloudDatastore中。
通常无法看到它们,所以可以使用类似于以下的GQL语句进行确认。
SELECT * FROM sessions
另外,根据我阅读的资料,或许也需要添加这个…
FILESYSTEM_DRIVER=gae
こちらはまだ利用の機会がないので検証できしだい書き換えます。(経験者の編集リクエスト歓迎)
app.yaml 文件
app.yaml基本上是按照GCP文档的内容编写的。
runtime: php72
handlers:
# Serve a directory as a static resource.
- url: /css
static_dir: public/css
- url: /image
static_dir: public/image
- url: /js
static_dir: public/js
# Serve images as static resources.
- url: /(.+\.(gif|png|jpg))$
static_files: \1
upload: .+\.(gif|png|jpg)$
# Serve your app through a front controller at index.php or public/index.php.
- url: .*
script: auto
注意点は、skip_filesディレクティブがなくなったので、アップロードしたくないファイルは.gcloudignoreに記述することでしょうか。これをしないとvendorのファイルで軽くファイル数上限の10000を超えるでしょう。
また、GAE/PHPで.gcloudignoreにcomposer.lockを入れてはいけないで記述されている以下の点も要注意です。(大変参考になりました。ありがとうございます!)
どうやらPHP 7.2環境では/vendor/ディレクトリは特別扱いされているようで、自分の手元の/vendor/をアップロードしても無視されます。代わりに、アップロードされたcomposer.lockを元にcomposer installした結果が反映されます。
换句话说,如果必须直接修改vendor目录下的文件才能使之运行,例如”laralib/l5scaffold”,那就无法进行下去了。
参考:关于在Laravel 5.6中无法正常运行脚手架的问题。
$ gcloud app deploy --project=MY_PROJECT_ID
(中略)
Script gcloud app deploy --project=MY_PROJECT_ID handling the deploy event returned with error code 1
建造的细节将输出以下类似的日志。
...
Step #1 - "builder": Generating optimized autoload files
Step #1 - "builder": > Illuminate\Foundation\ComposerScripts::postAutoloadDump
Step #1 - "builder": > @php artisan package:discover
Step #1 - "builder": [2018-11-11 09:43:06] staging.ERROR: Trait 'Illuminate\Console\AppNamespaceDetectorTrait' not found {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Trait 'Illuminate\\Console\\AppNamespaceDetectorTrait' not found at /workspace/vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php:21)"} []
Step #1 - "builder": Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255
Step #1 - "builder":
Step #1 - "builder": error: `composer_update_lock` returned code: 255
Finished Step #1 - "builder"
ERROR
ERROR: build step 1 "gcr.io/gae-runtimes/php72_app_builder:php72_7_2_8_20181026_RC00" failed: exit status 1
幸运的是,”laralib/l5scaffold”在运行时是不必要的,所以我通过在config/app.php文件中将Laralib\L5scaffold\GeneratorsServiceProvider::class注释掉来避免了它。如果有人知道更明智的处理方法,请务必指教。