PHP 7 ランタイムは、ウェブサービスのコードとその依存関係をインストールしてサービスを実行する役割を果たすソフトウェア スタックです。
App Engine スタンダード環境用の PHP 7 ランタイムは app.yaml
ファイル内で次のように宣言されています。
PHP 7.2
runtime: php72
PHP 7.3
runtime: php73
PHP 7.4
runtime: php74
PHP のバージョン
PHP 7 ランタイムは、PHP 7.2、PHP 7.3、PHP 7.4 をサポートし、選択したバージョンの最新の安定版を使用します。App Engine ではアプリのデプロイ時に新しいリリース バージョンに自動的に更新されますが、マイナー バージョンの更新は自動的に行われません。
たとえば、PHP 7.3.0 以降にデプロイしたアプリがバージョン 7.3.1 に自動的にアップデートされることはあっても、PHP 7.4.0 に自動的にアップデートされることはありません。
アプリの起動
リクエストのルーティングを適切に管理するフロント コントローラをデプロイする必要があります。
アプリを提供するさまざまな方法を次に示します。
アプリに
public/index.php
またはindex.php
ファイルが含まれている場合、App Engine はこのファイルを使用してアプリを提供します。Laravel や Symfony、Slim のようなフレームワークの使用をおすすめします。軽量なルーティング機能を利用して、PHP アプリを短時間で作成してデプロイできます。Slim フロント コントローラの例をご覧ください。
ただし、以前のアプリを移行する場合は、次のサンプル
index.php
ファイルを参照して必要な PHP ファイルをインポートし、フロント コントローラを手動で実装します。app.yaml
ファイルでオプションのentrypoint
要素を指定すると、App Engine はpublic/index.php
やindex.php
ではなく、entrypoint
要素内のコマンドを使用してアプリを提供します。entrypoint: serve path/to/my/front/controller.php
entrypoint
フィールドでは、組み込みのserve
コマンドが使用されます。これは PHP 7 ランタイム内のプログラムの一種で、php-fpm
実装とウェブサーバーをバックグラウンドで起動します。このウェブサーバーは、フロント コントローラ デザイン パターンに従い、すべてのトラフィックを指定の PHP ファイルにルーティングします。serve
コマンドには、次の 2 つのフラグ(省略可)があります。--workers=N
:php-fpm
ワーカー数 N を指定します。--workers
フラグを省略した場合、serve
コマンドは利用可能なメモリの量に基づいてワーカー数を推測します。最良の結果を得るため、serve
コマンドの--workers
フラグとmax_concurrent_requests
要素に同じ値を設定してください。--enable-dynamic-workers
: 必要な場合にのみ生成したいphp-fpm
ワーカーを指定します。php-fpm
ワーカー数に関してデフォルトでは、静的なポリシーが適用されます。--workers=N
フラグを使用すると、生成されるワーカーの最大数を変更できます。デフォルトでは、生成されるワーカーの最大数は静的なポリシーによって設定された数になります。
オプションのフラグは、フロント コントローラ パスの前に配置する必要があります。
entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
長時間動作するワーカー プロセスをデプロイするには、
entrypoint
要素にワーカー プロセスのファイルパスを設定します。entrypoint: php long-running-worker-file.php
entrypoint
要素で長時間動作のプロセスを含むスクリプトを実行する場合は、(たとえば、Pub/Sub 型のワーカーをトピックに登録するようなケースでは)serve
コマンドを使用しないでください。
詳細については、app.yaml
リファレンスをご覧ください。
有効化されている拡張機能
App Engine の PHP 7 ランタイムでは以下の拡張機能が有効になっています。
- BCMath
- bz2
- Calendar
- core
- cgi
- ctype
- cURL
- date
- dba
- dom
- enchant
- Exif
- fcgi
- fileinfo
- filter
- FTP
- GD
- gettext
- GMP
- hash
- iconv
- intl
- json
- LDAP
- libxml
- mbstring
- MYSQLi
- mysqlnd
- MySQL(PDO)
- OPcache
- OpenSSL
- PCNTL
- pcre
- PDO
- pgsql
- Phar
- posix
- PostgreSQL(PDO)
- Reflection
- session
- Shmop
- SimpleXML
- SOAP
- Sockets
- SPL
- SQLite(PDO)
- SQLite3
- standard
- test
- tidy
- tokenizer
- XML
- XMLreader
- XMLrpc
- XMLwriter
- XSL
- zend
- Zip
- Zlib
動的に読み込み可能な拡張機能
次の拡張機能は、php.ini
を構成することで動的に読み込むことができます。
これらの拡張機能を有効にするには、以下に示すように、extension
の下にある 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
環境変数
ランタイムは以下の環境変数を設定します。
環境変数 | 説明 |
---|---|
GAE_APPLICATION
|
App Engine アプリケーションの ID。この ID の先頭には「region code~」が付きます。たとえば、ヨーロッパでデプロイされたアプリケーションの場合は「e~」となります。 |
GAE_DEPLOYMENT_ID |
現在のデプロイの ID。 |
GAE_ENV |
App Engine の環境。standard に設定します。 |
GAE_INSTANCE |
現在サービスが実行されているインスタンスの ID。 |
GAE_MEMORY_MB |
アプリケーション プロセスで使用可能なメモリ量(MB)。 |
GAE_RUNTIME |
app.yaml ファイル内で指定したランタイム。 |
GAE_SERVICE |
app.yaml ファイル内で指定したサービス名。サービス名が指定されていない場合は、default に設定されます。 |
GAE_VERSION |
サービスの現在のバージョン ラベル。 |
GOOGLE_CLOUD_PROJECT |
アプリケーションに関連付けられた Cloud プロジェクト ID。 |
PORT |
HTTP リクエストを受信するポート。 |
app.yaml
ファイル内で追加の環境変数を定義できますが、上記の値をオーバーライドすることはできません。
HTTPS プロキシと転送プロキシ
App Engine は、ロードバランサにおいて HTTPS 接続を終了し、リクエストをアプリケーションに転送します。アプリケーションによっては、元のリクエストの IP とプロトコルが何か確認する必要があります。ユーザーの IP アドレスは、標準の X-Forwarded-For
ヘッダーで確認できます。この情報が必要なアプリケーションでは、プロキシを信頼するようにウェブ フレームワークを構成してください。
ファイルシステム
ランタイムは書き込み可能な /tmp
ディレクトリを持ち、それ以外のディレクトリはすべて読み取り専用です。/tmp
に書き込むとシステムメモリが消費されます。詳細については、tempnam()
と sys_get_temp_dir()
サポートをご覧ください。
メタデータ サーバー
アプリケーションの各インスタンスは、App Engine メタデータ サーバーを使用してインスタンスとプロジェクトに関する情報を照会できます。
次のエンドポイントを介してメタデータ サーバーにアクセスできます。
http://metadata
http://metadata.google.internal
次の表に、特定のメタデータを取得するための HTTP リクエストの各エンドポイントを示します。
メタデータ エンドポイント | 説明 |
---|---|
/computeMetadata/v1/project/numeric-project-id |
プロジェクトに割り当てられているプロジェクト番号。 |
/computeMetadata/v1/project/project-id |
プロジェクトに割り当てられているプロジェクト ID。 |
/computeMetadata/v1/instance/zone |
インスタンスが実行されているゾーン。 |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
プロジェクトに割り当てられているデフォルトのサービス アカウントのメール。 |
/computeMetadata/v1/instance/service-accounts/default/ |
プロジェクトのすべてのデフォルトのサービス アカウントを一覧表示します。 |
/computeMetadata/v1/instance/service-accounts/default/scopes |
デフォルトのサービス アカウントでサポートされているすべてのスコープを一覧表示します。 |
/computeMetadata/v1/instance/service-accounts/default/token |
アプリケーションを他の Google Cloud APIs に認証させるための認証トークンを返します。 |
たとえば、プロジェクト ID を取得するには、リクエストを http://metadata.google.internal/computeMetadata/v1/project/project-id
に送信します。
cURL または Google Cloud クライアント ライブラリを使用してメタデータ エンドポイントを呼び出す方法の例を次に示します。
セッション
PHP が提供するセッション管理レイヤを使用して、ウェブアプリはリクエスト間でユーザー状態情報を保持できます。App Engine のセッションは、他の PHP アプリのセッションと同様に動作します。
ユーザーのセッションで変数を設定するには、次のコードを使用します。
session_start();
$_SESSION['Foo'] = 'Bar';
次のコードは、同じユーザーの後続のリクエストで Bar
を出力します。
session_start();
print $_SESSION['Foo']; // prints Bar
長期間にわたるセッションでは、Cloud SQL のような別のストレージ サービスを利用してください。
$_SERVER の特別なキー
PHP では、リクエストのスコープで特別な $_SERVER[]
配列を使用できるようになっています。標準の CGI パラメータに加えて、いくつかの有用なキーが App Engine に追加されています。
GAE_APPLICATION
- 現在のアプリの Google Cloud プロジェクト ID。GAE_DEPLOYMENT_ID
- デプロイされたソースコードの ID。GAE_ENV
- アプリが実行される App Engine 環境(スタンダードまたはフレキシブル)。GAE_INSTANCE
- 現在実行されているインスタンスの名前。GAE_MEMORY_MB
- アプリプロセスが利用できるメモリの量(MB)。GAE_RUNTIME
-app.yaml
ファイルで指定されたランタイム(php72 など)。GAE_SERVICE
- 現在デプロイされているサービスの名前。GAE_VERSION
- 現在デプロイされているバージョンの名前。GOOGLE_CLOUD_PROJECT
- Google Cloud プロジェクト ID。HTTP_X_APPENGINE_CITY
- リクエスト送信元の都市の名前。たとえば、リクエストの送信元がマウンテンビューという都市の場合は、ヘッダー値が mountain view となります。HTTP_X_APPENGINE_CITYLATLONG
- リクエストの発信元の都市の緯度と経度。米国のマウンテンビューからのリクエストの場合は、この文字列が「37.386051,-122.083851」などとなります。HTTP_X_APPENGINE_COUNTRY
- リクエストの発信元の国の国番号(ISO 3166-1 alpha-2 形式)。App Engine は、クライアントの IP アドレスからこのコードを決定します。HTTP_X_APPENGINE_HTTPS
- HTTPS の使用状況を確認します。HTTP_X_APPENGINE_REGION
- リクエストの発信元のリージョンの名前。この値は、X-Appengine-Country
の国のコンテキストでのみ意味があります。たとえば、国が「US」でリージョンが「ca」なら、「ca」はカナダではなく「カリフォルニア州」を意味します。HTTP_X_APPENGINE_USER_IP
- クライアントの IP アドレス。なお、$_SERVER['HTTP_X_APPENGINE_USER_IP']
はアプリがクライアントの IP アドレスを取得できる唯一の方法です。$_SERVER['REMOTE_ADDR']
変数は App Engine では使用できません。
デフォルト値が変更されたディレクティブ
次の表に、php.net から入手できる標準の PHP インタープリタと異なるデフォルト値を持つディレクティブを示します。
ディレクティブ | App Engine のデフォルト値 |
---|---|
expose_php |
Off |
memory_limit |
-1 |
max_execution_time |
0 |
error_reporting |
E_ALL & ~E_DEPRECATED & ~E_STRICT |
display_errors |
Off |
display_startup_errors |
Off |
log_errors |
On |
log_errors_max_len |
0 |
ignore_repeated_errors |
Off |
ignore_repeated_source |
Off |
html_errors |
Off |
opcache.enable |
On |
opcache.validate_timestamps |
Off |
opcache.memory_consumption |
32 |
アプリの php.ini
ファイル内でディレクティブを指定すれば、上記のデフォルトのディレクティブをオーバーライドできます。
tempnam()
と sys_get_temp_dir()
のサポート
App Engine アプリはセキュリティ サンドボックス内で動作します。書き込み可能なディレクトリは /tmp
のみで、インスタンスの RAM に格納されます。そのため、App Engine 版の tempnam()
は、Cloud Storage バケットのような永続的なストレージ ソリューションに書き込めるメモリ内一時ファイルを返します。
次の例は、file_put_contents()
と fwrite()
を使用してメモリ内の一時ファイルに書き込む方法を示しています。
<?php
$dir = sys_get_temp_dir();
$tmp = tempnam($dir, “foo”);
file_put_contents($tmp, “hello”);
$f = fopen($tmp, “a”);
fwrite($f, “ world”);
fclose($f);
echo file_get_contents($tmp);
この例の出力は次のようになります。
hello world
Composer による依存関係の管理
詳細については、依存関係の指定のページをご覧ください。