PHP ランタイムは、ウェブサービスのコードとその依存関係をインストールしてサービスを実行する役割を果たすソフトウェア スタックです。
App Engine スタンダード環境に PHP 7/8 を指定するには、app.yaml
ファイルでランタイムを宣言します。次に例を示します。
runtime: phpVERSION
ここで、VERSION は PHP MAJOR MINOR
のバージョン番号です。たとえば、PHP 8.3 では 83
を使用します。
サポートされている他の PHP バージョンと、お使いの PHP バージョンに対応する Ubuntu バージョンについては、ランタイム サポート スケジュールをご覧ください。
PHP のバージョン
PHP ランタイムは、app.yaml
ファイルで指定されているバージョンの最新の安定版を使用します。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/8 ランタイム内のプログラムの一種で、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
トピックに登録した Pub/Sub ワーカーなど、長時間動作のプロセスを含むスクリプトを
entrypoint
要素で実行する場合は、serve
コマンドを使用しないでください。
詳細については、app.yaml
リファレンスをご覧ください。
有効化されている拡張機能
App Engine の PHP 7/8 ランタイムでは以下の拡張機能が有効になっています。
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
sodium (PHP 8.x only, not available for PHP 7.x)
SPL
SQLite (PDO)
SQLite3
standard
test
tidy
tokenizer
XML
XMLreader
XMLrpc (PHP 7.x only, not available for PHP 8.x)
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
環境変数
ランタイムは以下の環境変数を設定します。
環境変数 | 説明 |
---|---|
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 |
アプリケーションに関連付けられた Google Cloud プロジェクト ID。 |
PORT |
HTTP リクエストを受信するポート。 |
NODE_ENV (Node.js ランタイムでのみ使用可能) |
サービスがデプロイされたとき production に設定。 |
app.yaml
ファイル内で追加の環境変数を定義できますが、上記の値は NODE_ENV
を除きオーバーライドできません。
HTTPS プロキシと転送プロキシ
App Engine は、ロードバランサにおいて HTTPS 接続を終了し、リクエストをアプリケーションに転送します。アプリケーションによっては、元のリクエストの IP とプロトコルが何か確認する必要があります。ユーザーの IP アドレスは、標準の X-Forwarded-For
ヘッダーで確認できます。この情報が必要なアプリケーションでは、プロキシを信頼するようにウェブ フレームワークを構成してください。
ファイルシステム
ランタイムは書き込み可能な /tmp
ディレクトリを持ち、それ以外のディレクトリはすべて読み取り専用です。/tmp
に書き込むとシステムメモリが消費されます。詳細については、tempnam()
と sys_get_temp_dir()
サポートをご覧ください。
メタデータ サーバー
アプリケーションの各インスタンスは、App Engine メタデータ サーバーを使用してインスタンスとプロジェクトに関する情報を照会できます。
次のエンドポイントを介してメタデータ サーバーにアクセスできます。
http://metadata
http://metadata.google.internal
メタデータ サーバーに送信されるリクエストには、リクエスト ヘッダー Metadata-Flavor: Google
を挿入する必要があります。このヘッダーは、メタデータ値を取得する目的でリクエストが送信されたことを示します。
次の表に、特定のメタデータを取得するための HTTP リクエストの各エンドポイントを示します。
メタデータ エンドポイント | 説明 |
---|---|
/computeMetadata/v1/project/numeric-project-id |
プロジェクトに割り当てられているプロジェクト番号。 |
/computeMetadata/v1/project/project-id |
プロジェクトに割り当てられているプロジェクト ID。 |
/computeMetadata/v1/instance/region |
インスタンスが実行されているリージョン。 |
/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 インタープリタのものと異なるディレクティブを示します。次の表に示されていないディレクティブのデフォルト値を確認するには、php.ini のディレクティブをご覧ください。
ディレクティブ | 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 による依存関係の管理
詳細については、依存関係の指定のページをご覧ください。