PHP 7/8 ランタイム環境

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 ファイルをインポートし、フロント コントローラを手動で実装します。

    switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
        case '/':
            require 'homepage.php';
            break;
        case '/contact.php':
            require 'contact.php';
            break;
        default:
            http_response_code(404);
            exit('Not Found');
    }
  • app.yaml ファイルでオプションの entrypoint 要素を指定すると、App Engine は public/index.phpindex.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 クライアント ライブラリを使用してメタデータ エンドポイントを呼び出す方法の例を次に示します。

/**
 * Requests a key from the Metadata server using the Google Cloud SDK. Install
 * the Google Cloud SDK by running "composer install google/cloud"
 *
 * @param $metadataKey the key for the metadata server
 */
function request_metadata_using_google_cloud($metadataKey)
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $metadataValue = $metadata->get($metadataKey);

    return $metadataValue;
}

/**
 * Requests a key from the Metadata server using cURL.
 *
 * @param $metadataKey the key for the metadata server
 */
function request_metadata_using_curl($metadataKey)
{
    $url = 'http://metadata/computeMetadata/v1/' . $metadataKey;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Metadata-Flavor: Google'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    return curl_exec($ch);
}

セッション

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 による依存関係の管理

詳細については、依存関係の指定のページをご覧ください。