PHP 7 ランタイム環境

PHP 7 ランタイムは、ウェブサービスのコードとその依存関係をインストールしてサービスを実行する役割を果たすソフトウェア スタックです。

App Engine は、スタンダード環境の PHP 7.2 および PHP 7.3(ベータ版)ランタイムをサポートしており、app.yaml ファイル内で次のように宣言されています。

PHP 7.2

runtime: php72

PHP 7.3(ベータ版)

runtime: php73

PHP のバージョン

PHP 7 ランタイム環境では、最新の安定版 PHP 7.2 および PHP 7.3 が使用されています。App Engine ではアプリのデプロイ時に新しいマイナー バージョンに自動的に更新されますが、メジャー バージョンの更新は自動的に行われません。

たとえば、PHP 7.2.0 以降にデプロイしたアプリケーションがバージョン 7.2.1 に自動的にアップデートされることはあっても、PHP 7.3.0 に自動的にアップデートされることはありません。

アプリケーションの起動

リクエストのルーティングを適切に管理するフロント コントローラをデプロイする必要があります。

アプリケーションを提供するさまざまな方法を以下に示します。

  • アプリに public/index.php または index.php ファイルが含まれている場合、App Engine はこのファイルを使用してアプリケーションを提供します。

    LaravelSymfonySlim のようなフレームワークの使用をおすすめします。軽量なルーティング機能を利用して、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 要素をカスタマイズすれば、別のファイルからアプリケーションを提供できます。

    PHP 7.2

    runtime: php72
    # the default is to serve your app using `public/index.php` or `index.php`
    entrypoint: serve path/to/my/front/controller.php
    

    PHP 7.3(ベータ版)

    runtime: php73
    # the default is to serve your app using `public/index.php` or `index.php`
    entrypoint: serve path/to/my/front/controller.php
    

    ランタイムは app.yaml ファイル内の entrypoint 要素を使用してアプリケーションを起動します。

    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 フラグを使用すると、生成されるワーカーの最大数を変更できます。デフォルトでは、生成されるワーカーの最大数は静的なポリシーによって設定された数になります。

    オプションのフラグは、フロント コントローラ パスの前に配置する必要があります。

    PHP 7.2

    runtime: php72
    entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
    

    PHP 7.3(ベータ版)

    runtime: php73
    entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
    
  • 長時間動作するワーカー プロセスをデプロイするには、entrypoint 要素にワーカー プロセスのファイルパスを設定します。

    PHP 7.2

    runtime: php72
    entrypoint: php long-running-worker-file.php
    

    PHP 7.3(ベータ版)

    runtime: php73
    entrypoint: php long-running-worker-file.php
    

    entrypoint 要素で長時間動作のプロセスを含むスクリプトを実行する場合は(たとえば、Pub/Sub 型のワーカーをトピックに登録するようなケースでは)serve コマンドを使用しないでください。

詳細については、app.yaml リファレンスをご覧ください。

有効化されている拡張機能

App Engine の PHP ランタイムでは以下の拡張機能が有効になっています。

  • 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 を構成して動的に読み込むことができます。

これらの拡張機能を有効にするには、php.ini ファイル内で extension の下に拡張機能のディレクティブを追加します。次に例を示します。

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。
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 アプリケーションに関連付けられた GCP プロジェクトの ID。
NODE_ENV サービスがデプロイされたとき production に設定。
PORT HTTP リクエストを受信するポート。

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

次の表に、特定のメタデータを取得するための 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 API に認証させるための認証トークンを返します。

たとえば、プロジェクト 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 Platform プロジェクト 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 - GCP プロジェクト 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 アドレス。

デフォルト値が変更されたディレクティブ

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

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

App Engine スタンダード環境での PHP 7.2 に関するドキュメント