概要
PHP ランタイムは、アプリケーションのコードと依存関係をインストールして実行するソフトウェア スタックです。このフレキシブル ランタイムは、app.yaml
内で次のように宣言されています。
runtime: php
env: flex
フレキシブル環境のランタイムは、Docker を使用してビルドされています。PHP ランタイムは、Ubuntu 16.04 に基づいています。PHP ランタイムのソースコードは GitHub で公開されています。
PHP バージョンの選択
デフォルトでは、PHP ランタイムは PHP 7.2
を使用しますが、新しいバージョンの PHP が利用可能になったときにアプリケーションが自動的にアップグレードされないように、composer.json
ファイルに PHP のバージョンを明示的に宣言する必要があります。PHP バージョン 5.6.*
、7.0.*
、7.1.*
もサポートされています。
{
"require": {
"php": "7.2.*"
}
}
OPcache
デフォルトでは、ランタイムに OPcache がコンパイルされ、有効になります。
OPcache の構成方法については、公式のドキュメントをご覧ください。
OPcache を無効にするには、次の行を含む php.ini
ファイルを作成するか、この行をファイルに追加します。
opcache.enable=0
依存関係
ランタイムは、アプリケーションの起動前にアプリケーションのソース ディレクトリにある composer.json
ファイルを探し、composer
を使用して依存関係をインストールします。パッケージの宣言と管理の詳細については、PHP ライブラリの使用をご覧ください。
PHP 拡張機能の使用
システムに次の PHP 拡張機能がインストールされ、有効になっています。
- APCu
- Bzip2
- cURL
- FPM
- GMP
- mbstring
- mcrypt
- libsodium
- Memcached
- MySQL(PDO)(mysqlnd を使用)
- MySQLi(mysqlnd を使用)
- OPcache
- OpenSSL
- pcntl
- PostgreSQL
- PostgreSQL(PDO)
- Readline
- recode
- sem
- Sockets
- Zip
- Zlib
次の PHP 拡張機能は共有としてコンパイルされますが、デフォルトでは無効になっています。
- amqp
- APM(7.0 以上)
- BCMath
- Bitset
- Calendar
- Cassandra
- couchbase(7.0 以上)
- ds(7.0 以上)
- eio
- ev
- event
- Exif
- FTP
- GD(PNG、JPEG、FreeType サポート付き)
- gettext
- gRPC
- hprose
- igbinary
- intl
- ImageMagick
- jsond
- krb5
- lua(7.0 以上)
- LZF
- memprof
- MongoDB
- MySQL(5.6)
- oauth
- OpenCensus
- PCNTL
- Phalcon(5.6、7.0)
- pq
- protobuf
- rdkafka
- Redis
- SeasLog
- Shmop
- SOAP
- SQLite3
- SQLite(PDO)
- Stackdriver Debugger(7.0 以上)
- stomp
- swoole
- sync
- tcpwrap
- timezonedb
- v8js(7.0 以上)
- vips(7.0 以上)
- XMLRPC
- XSL
- yaconf(7.0 以上)
- yaf
- yaml
拡張機能を有効にするには、アプリケーションのルートに php.ini
ファイルを追加し、extension
ディレクティブを使用します。
; Enable the Redis extension
extension=redis.so
また、composer.json
に require
を追加して拡張機能を有効にすることもできます。
{
"require": {
"ext-redis": "*"
}
}
これらのパッケージでは、最も一般的な PHP 拡張機能をインストールできます。アプリケーションで追加のオペレーティング システム レベルの依存関係が必要な場合は、PHP ランタイムを拡張するか、カスタム ランタイムを使用して適切なパッケージをインストールする必要があります。
HTTPS プロキシと転送プロキシ
App Engine はロードバランサで HTTPS 接続を終了し、リクエストをアプリケーションに転送します。NGINX サーバーは、HTTPS 経由でリクエストを受信したときに HTTPS 環境変数($_SERVER["HTTPS"]
)を on
に設定します。
一部のアプリケーションでは、ユーザーの IP アドレスの確認が必要になります。この情報は標準の X-Forwarded-For
ヘッダーにあります。
無効になっている関数
次の関数は、php.ini
の disable_functions
ディレクティブで無効になっています。
exec
passthru
proc_open
proc_close
shell_exec
show_source
symlink
system
これらの関数が必要な場合は、アプリケーションのルートに php.ini
ファイルを追加し、disable_functions
ディレクティブを変更します。あるいは、許可する関数のカンマ区切りリストを app.yaml
の runtime_config
セクションにある whitelist_functions
に設定します。
PHP 5.6 では Suhosin Security 拡張機能がインストールされ、デフォルトではシミュレーション モードに設定されています。シミュレーション モードでは、危険性のある関数の使用がログに記録されます。この記録は Cloud Logging UI に表示されます。シミュレーション モードをオフにした場合、危険性のある関数が使用されると、アプリケーションが終了します。この追加のセキュリティ機能を有効にするには、プロジェクト ルートの php.ini
に次のオプションを追加します。
; Prevent the use of potentially dangerous functions rather than logging them
suhosin.simulation = Off
パッチが適用された関数
parse_str
関数にパッチが適用され、2 つ目のパラメータが必須になりました。1 つのパラメータで parse_str
を呼び出すと、警告がスローされ、関数は呼び出されません。
ドキュメント ルートの宣言
アプリケーションにドキュメント ルートを宣言する必要があります。この設定は app.yaml
で行います。
runtime: php
vm: true
api_version: 1
runtime_config:
document_root: web
.
(ドット)を使用するとプロジェクト ディレクトリ全体を指定できますが、この方法はおすすめしません。
NGINX のカスタマイズ
nginx-app.conf
構成ファイルは、メインの NGINX 構成ファイルの server セクションに含まれています。デフォルトの構成ファイルは次のようになります。
location / {
# try to serve files directly, fallback to the front controller
try_files $uri /$front_controller_file$is_args$args;
}
カスタム構成ファイルを定義するには、nginx-app.conf
という名前のファイルをプロジェクトのルート ディレクトリに配置します。ランタイムでは、指定したファイルでデフォルトのファイルが上書きされます。
デフォルトでは、フレームワーク フロント コントローラとして index.php
が使用されます。プロジェクトでこの設定の変更が必要になる場合もあります。たとえば、Symfony フレームワークは index.php
ではなく app.php
を使用します。ファイル名は app.yaml
の runtime_config
セクションで変更できます。
runtime: php
env: flex
runtime_config:
document_root: web
front_controller_file: app.php
PHP ランタイムでの supervisord の構成
App Engine フレキシブル環境では、supervisord でプロセスを管理します。デフォルトでは、supervisord は nginx と php-fpm を実行して PHP ウェブ アプリケーションを実行します。ただし、一部のアプリケーションでは外部プロセスを実行する必要があります。また、このようなアプリケーションでは、nginx や php-fpm が不要になることもあります。
supervisord により管理されるプロセスを追加する場合は、additional-supervisord.conf
という名前のファイルをプロジェクトのルート ディレクトリに追加します。この場合のサンプル構成ファイルの内容を次に示します。
nginx と php-fpm を独自のプロセスに置き換える場合は、supervisord.conf
という名前のファイルをプロジェクトのルート ディレクトリに追加します。この場合のサンプル構成ファイルの内容を次に示します。
ランタイムの拡張
フレキシブル環境の PHP ランタイムを使用して、カスタム ランタイムを作成できます。カスタム ランタイムは Dockerfile
を介して構成されます。gen-config
を使用すると、PHP ランタイムに基づく Dockerfile
を生成できます。
gcloud beta app gen-config --custom
Dockerfile
と .dockerignore
を必要に応じてカスタマイズします。最後に、app.yaml
で runtime: php
の代わりに runtime: custom
を指定します。詳細については、PHP ランタイムのカスタマイズをご覧ください。
環境変数
次の環境変数が、ランタイム環境によって設定されます。
環境変数 | 説明 |
---|---|
GAE_INSTANCE |
現在のインスタンスの名前。 |
GAE_MEMORY_MB |
アプリケーション プロセスで使用可能なメモリ量。 |
GAE_SERVICE |
アプリケーションの app.yaml ファイルで指定されたサービス名。サービス名が指定されていない場合は、default に設定されます。 |
GAE_VERSION |
現在のアプリケーションのバージョン ラベル。 |
GOOGLE_CLOUD_PROJECT |
アプリケーションに関連付けられたプロジェクト ID。この ID は、Google Cloud Platform Console に表示されます。 |
PORT |
HTTP リクエストを受信するポート。 |
その他の環境変数は app.yaml
で設定できます。
メタデータ サーバー
アプリケーションのインスタンスは、ホスト名、外部 IP アドレス、インスタンス ID、カスタム メタデータ、サービス アカウント情報など、インスタンスに関する情報を Compute Engine メタデータ サーバーから取得します。App Engine では、インスタンスごとにカスタム メタデータを設定することはできませんが、プロジェクト単位のカスタム メタデータを設定して、App Engine インスタンスや Compute Engine インスタンスから読み取ることができます。
次のサンプル関数では、メタデータ サーバーからインスタンスの外部 IP アドレスを取得します。