koni blog

東京のウェブエンジニア koni です!ウェブサービスをガシガシ作っていきます!

Google App Engine PHP 7.2 がリリース!これまでの違いと利用手順

この記事はAutoScale Advent Calendar 2018 - Qiitaの11日目です。

2018年7月12日、Google App Engine(GAE) がついに PHP 7.2 に対応しました!

SocialDogや、AutoScaleのウェブサイトなど、ちょっと動的な要素があって、キャッシュが効きそうなページでは、Google App Engine を積極的に活用してきました。*1

いままでGAEではPHP5.5しか対応していなかったので、PHP7.2 への対応で一気に未来にきた感じがあります。 ちなみにPHP5.6, 5.7, 7.1 など間のバージョンには対応していません。GAE でPHPを使う場合は、PHP5.5か7.2の2択です。

この記事では既存のPHP5.5のプロジェクトをPHP7.2で使うための設定を見てみようと思います。

Google App Engine PHP5.5 とPHP 7.2 の主な違い

  • 自由度が大幅アップ!
    • ランタイム環境が第一世代から第二世代(gVisor ベースのコンテナサンドボックス環境)になった
    • 拡張の導入が可能に。しかも簡単
    • URL取得関数を使わなくても外部ネットワークアクセスが可能に
    • ファイルシステムへのアクセス権が付与。/tmpにアクセス可能に
  • app.yaml の仕様変更
  • Compose の自動インストール(composer.json をルートに置くだけで自動的にデプロイ可能に)
    • .gitigonore している場合は無視されるそうなので通常は特段の対応不要?
  • App Engine 独自の機能へのアクセスの廃止
    • GAE は Google Cloud Platform となる前からあるサービスであるという歴史的経緯から残っていた、GAEの中の Memcached ,BlobStore, Mail, Taskキュー, 検索、ログサービスなどが廃止になりました。今後はCloud Storage や Cluod Datastore などのGCPの他のサービスを使ってということのようです。
    • ただし、メール送信*2や、Memcache*3、検索*4などGCPにはないのに廃止されている機能もあるので、これらに依存している場合は、PHP7.2への以降はかなり大変そうです。
  • ローカルでのテストコマンド dev_appserver.py の廃止

Google App Engine PHP5.5 とPHP 7.2 で変わらない点

  • 無料枠の定義
  • SLA(ただしPHP7.2 はまだベータなので正式版になったら変わらないはず)
  • デプロイコマンド(gcloud app deploy

PHP 7.2 に移行できない環境

App Engine 独自の機能を使っていた場合は、PHP7.2環境への移行はかなり困難そうです。すでに動いているプロジェクトなのであれば今は諦めて、当該の機能が GCP でフルマネージドなサービスが出るまで待つ、というのもありかと思います。

app.yaml の仕様変更

以下のパラメータは廃止予定なので削除します。

threadsafe, api_version, application_readable, builtins, libraries

runtimeをPHP7.2にします。

runtime: php72

handlers の子の scriptscript: autoのみ設定できるようになりました。

生のPHPを直接置くよりもフレームワークのエントリーポイントのファイルをひとつだけ指定してルーティングするのが普通なので、この修正は納得感があります。

以下のように指定すると、/images 以下は直接呼びつつ、それ以外は index.phppublic/index.phpを勝手に呼んでくれます。

handlers:
- url: /images
  static_dir: static/images

- url: /.*
  script: auto

詳細は以下を参照:

app.yaml ドキュメント

拡張機能の追加

拡張機能を追加したい場合は、php.iniをおいて、以下のようにします。

extension=memcached.so
extension=grpc.so
extension=protobuf.so
extension=mongodb.so
extension=imagick.so
extension=opencensus.so
extension=redis.so
extension=stackdriver_debugger.so

ローカルでのテスト

dev_appserver.py が廃止されたので、以下のコマンドでテストします。

$ php -S localhost:8080

デプロイ

いままでどおりです。

$ gcloud app deploy --project [Project ID]

まとめ

PHP 7.2 では、PHP5.5 と比べてかなり自由度が高くなっています。

特に拡張が入れられる or 予め入っているというのと、ファイルシステムにアクセスできるあたりは、より柔軟に GAE を活用できるようにしてくれそうです。

一方で、既存の GAE のみの機能が使えなくなっているので、既存の PHP5.5 でそれらを使っていた場合は移行はかなり難しくなりそうです。特に Memcached を使っていた場合はかなりきついのではないでしょうか。

PHP5.5 から PHP7.2 とかなりバージョンアップしているので、パフォーマンス面でも改善しそうです(未検証)。

参考資料

*1:SocialDog 本体は別のサブドメインでGCEでうごいています

*2:ドキュメントではSendGridやMailjetがおすすめされている

*3:Radis Labs Cloud がおすすめされている

*4:ドキュメントには ElasticSearch on GCE を使ったらどう?と書いてあるが、PaaS とはなんだったのかw