PHP ランタイム

PHP ランタイムは、アプリケーションのコードと依存関係をインストールして、フレキシブル環境でそのアプリケーションを実行する役割を果たすソフトウェア スタックです。

  • バージョン 7.4 以降は Buildpack を使用してビルドされているため、app.yaml ファイルでオペレーティング システムを選択する必要があります。たとえば、PHP 8.3 を使用するには、オペレーティング システムとして Ubuntu 22 を指定する必要があります。

  • バージョン 7.3 以前は Docker を使用してビルドされています。

サポートされている PHP バージョンと対応する Ubuntu バージョンの完全なリストについては、ランタイム サポート スケジュールをご覧ください。

PHP のバージョンを選択する

新しいランタイム バージョン

PHP ランタイム バージョン 7.4 以降の場合は、次のことを行う必要があります。

  • app.yaml ファイルに runtime_configoperating_system の設定を追加して、オペレーティング システムを指定します。

  • アプリケーションのドキュメント ルートを app.yaml ファイルで宣言します。

      runtime: php
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
          document_root: .
    

    ドキュメント ルートとしてプロジェクトのルート(.) ディレクトリを指定できますが、document_root 設定にはサブディレクトリを使用することをおすすめします。

    PHP バージョン 7.4 以降の場合、ソースコードはルート ディレクトリ(/)ではなく /workspace ディレクトリにあります。構成をオーバーライドすると、NGINX または supervisor プロセスはこのディレクトリ内の構成ファイルを参照します。対応する参照を更新するには、次のことを行う必要があります。

    • NGINX 構成内の include ステートメントを、/etc/nginx ではなく /workspace を基準とした相対値に更新します。
    • gzip_params などの一部のファイルは含まれません。これらのファイルを参照するには、独自のファイルを含めるか、GitHub からコピーを含めます。mime.typesfastcgi_params などのファイルは /etc/nginx ディレクトリにあります。
    • nginx-plus-module-ndk などの一部の NGINX モジュールはインストールされません。$docroot 値を設定するか、NGINX 構成ファイルに値を手動で追加します。
  • gcloud CLI バージョン 420.0.0 以降をインストールします。CLI ツールを更新するには、gcloud components update コマンドを実行します。インストールされているバージョンを表示するには、gcloud version コマンドを実行します。

必要に応じて、次の方法でランタイムのバージョンを指定できます。

  • runtime_version 設定を app.yaml に含める。runtime_version の設定が指定されていない場合は、デフォルトで最新の PHP バージョンが使用されます。次に例を示します。

    • Ubuntu 22 で PHP 8.3 を指定するには:

      runtime: php
      env: flex
      
      runtime_config:
          operating_system: "ubuntu22"
          runtime_version: "8.3"
          document_root: .
      
    • Ubuntu 22 でサポートされている最新の PHP バージョンを指定するには:

        runtime: php
        env: flex
      
        runtime_config:
            operating_system: "ubuntu22"
            document_root: .
      
  • composer.json ファイルに PHP バージョンを含めます。

    {
        "require": {
            "php": "8.3.*"
        }
    }
    

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

以前のランタイム バージョン

PHP バージョン 7.3 以前の場合は、次のことを行う必要があります。

  • アプリケーションにドキュメント ルートを宣言します。これは app.yaml ファイルで行うことができます。

    runtime: php
    env: flex
    api_version: 1
    
    runtime_config:
      document_root: .
    

    ドキュメント ルートとしてプロジェクトのルート(.) ディレクトリを指定できますが、document_root 設定にはサブディレクトリを使用することをおすすめします。

  • PHP の新しいバージョンが利用可能になったときに、アプリケーションが自動的にアップグレードされないように、composer.json ファイルに PHP のバージョンを指定します。

    {
        "require": {
            "php": "7.3.*"
        }
    }
    

PHP 7.3 は Ubuntu 16.04 に基づいています。

NGINX をカスタマイズする

カスタム構成ファイルを定義するには、次のようにします。

v7.4 以降

プロジェクトのルート ディレクトリに nginx-app.conf ファイルを含めます。

デフォルトでは、フレームワーク フロント コントローラは index.php ファイルを使用します。プロジェクトでこの設定の変更が必要になる場合もあります。たとえば、Symfony フレームワークは index.php ではなく app.php を使用します。ファイル名は app.yaml ファイルの runtime_config セクションで変更できます。

runtime: php
env: flex

runtime_config:
operating_system: "ubuntu22"
document_root: .
front_controller_file: app.php

v7.3 以前

nginx-app.conf 構成ファイルは、メインの NGINX 構成ファイルのサーバー セクションに含まれています。たとえば、デフォルト構成の php-app.conf ファイルには次のものが含まれます。

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: .
front_controller_file: app.php

OPcache

PHP バージョン 7.3 以前では OPcache がコンパイルされ、デフォルトで有効になっています。PHP 7.4 以降では、php.ini ファイルで有効にする必要があります。OPcache の構成方法については、公式のドキュメントをご覧ください。

OPcache を無効にするには、次の行を使用してファイル php.ini を作成または編集します。

opcache.enable=0

依存関係

ランタイムは、アプリケーションの起動前にアプリケーションのソース ディレクトリで composer.json ファイルを探し、composer を使用して依存関係をインストールします。パッケージの宣言と管理の詳細については、PHP ライブラリの使用をご覧ください。

PHP 拡張機能の使用

システムに次の PHP 拡張機能がインストールされ、有効になっています。

v7.4 以降

php.ini ファイルを使用すると、次の拡張機能を有効にできます。

v7.3 以前

次の PHP 拡張機能はデフォルトで無効になっています。php.ini ファイルの使用で、次の拡張機能を有効にできます。

拡張機能を有効にするには、アプリケーションのルートに extension ディレクティブを指定して php.ini ファイルを追加します。

; Enable the Redis extension
extension=redis.so

また、composer.jsonrequire を追加して拡張機能を有効にすることもできます。

{
    "require": {
        "ext-redis": "*"
    }
}

これらのパッケージでは、最も一般的な PHP 拡張機能をインストールできます。アプリケーションで追加のオペレーティング システムレベルの依存関係が必要な場合は、PHP ランタイムを拡張するか、カスタム ランタイムを使用して適切なパッケージをインストールします。

HTTPS プロキシと転送プロキシ

App Engine はロードバランサで HTTPS 接続を終了し、リクエストをアプリケーションに転送します。NGINX サーバーは、HTTPS 経由でリクエストを受信したときに HTTPS 環境変数($_SERVER["HTTPS"])を on に設定するように構成されています。

一部のアプリケーションでは、ユーザーの IP アドレスの確認が必要になります。これは標準の X-Forwarded-For ヘッダーで使用できます。

無効になっている関数

次の関数は、php.inidisable_functions ディレクティブで無効になっています。

  • exec
  • passthru
  • proc_open
  • proc_close
  • shell_exec
  • show_source
  • symlink
  • system

これらの関数が必要な場合は、アプリケーションのルートに php.ini ファイルを追加し、disable_functions ディレクティブを変更します。あるいは、app.yamlruntime_config セクションにある whitelist_functions を、許可する関数のカンマ区切りリストに設定します。

PHP バージョン 7.3 以前では、suhosin 安全拡張機能がインストールされ、デフォルトでシミュレーション モードに構成されています。シミュレーション モードでは、危険性のある関数の使用がログに記録されます。この記録は 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 を呼び出すと、警告がスローされ、関数は呼び出されません。

有効な構成

runtime_config セクションには、次の構成を含めることができます。

名前説明デフォルト値
document_root nginx と PHP の DOCUMENT_ROOT を指定します。プロジェクトのルート ディレクトリに対する相対パスを使用する必要があります。 必須項目
composer_flags このキーで composer フラグの一部を無効にできます。 --no-dev --prefer-dist
enable_stackdriver_integration バージョン 7.3 以前でのみサポートされています。true に設定すると、ランタイムで Google Cloud Observability の統合が自動的に有効になります。この構成には、google/cloud パッケージ v0.33 以降が必要です。 false
skip_lockdown_document_root バージョン 7.3 以前でのみサポートされています。デフォルトでは、ランタイムは document_root ディレクトリ下のすべてのファイルとディレクトリに対して厳密な読み取り専用権限を設定します。true に設定すると、ランタイムは権限の変更をスキップします。 false
whitelist_functions バージョン 7.3 以前でのみサポートされています。許可リストに登録する関数名のカンマ区切りリストです。 空の文字列
front_controller_file ディレクトリ アクセスのデフォルトの PHP ファイル名。 index.php
nginx_conf_http_include nginx 構成の一部を含むファイル名。メインの nginx 構成ファイルの http セクションに含まれます。 nginx-http.conf
nginx_conf_include nginx 構成の一部を含むファイル名。メインの nginx 構成ファイルの server セクションに含まれます。 nginx-app.conf
nginx_conf_override ユーザーが指定する nginx 構成ファイルの名前。メインの nginx 構成ファイルとして使用されます。 nginx.conf
php_fpm_conf_override ユーザーが指定する php-fpm 構成ファイルの名前。[app] セクションの最後に追加され、既存の構成を上書きします。 php-fpm.conf
php_ini_override ユーザーが指定する PHP 構成ファイルの名前。 php.ini
supervisord_conf_addition ユーザーが指定する supervisord 構成ファイルの名前。メインの supervisord 構成ファイルに含まれます。 additional-supervisord.conf
supervisord_conf_override ユーザーが指定する supervisord 構成ファイルの名前。メインの supervisord 構成ファイルを上書きします。 supervisord.conf

PHP ランタイムでの supervisord の構成

App Engine フレキシブル環境では、supervisord でプロセスを管理します。デフォルトでは、supervisordnginxphp-fpm を実行して PHP ウェブ アプリケーションを実行します。ただし、一部のアプリケーションでは外部プロセスを実行する必要があります。また、このようなアプリケーションでは、nginxphp-fpm が不要になることもあります。

supervisord により管理されるプロセスを追加する場合は、additional-supervisord.conf という名前のファイルをプロジェクトのルート ディレクトリに追加します。この場合のサンプル構成ファイルの内容を次に示します。

[program:quote-updater]
command = php %(ENV_APP_DIR)s/worker.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

nginxphp-fpm を独自のプロセスに置き換える場合は、supervisord.conf という名前のファイルをプロジェクトのルート ディレクトリに追加します。この場合のサンプル構成ファイルの内容を次に示します。

[supervisord]
nodaemon = true
logfile = /dev/null
logfile_maxbytes = 0
pidfile = /var/run/supervisord.pid

[program:react-server]
command = php %(ENV_APP_DIR)s/index.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

ランタイムの拡張

App Engine フレキシブル環境の PHP ランタイムを使用して、カスタム ランタイムを作成できます。詳細については、PHP ランタイムのカスタマイズをご覧ください。

環境変数

次の環境変数が、ランタイム環境によって設定されます。

環境変数 説明
GAE_INSTANCE 現在のインスタンスの名前。
GAE_MEMORY_MB アプリケーション プロセスで使用可能なメモリ量。
GAE_SERVICE アプリケーションの app.yaml ファイルで指定されたサービス名。サービス名が指定されていない場合は、default に設定されます。
GAE_VERSION 現在のアプリケーションのバージョン ラベル。
GOOGLE_CLOUD_PROJECT アプリケーションに関連付けられたプロジェクト ID。この ID は、Google Cloud Console に表示されます。
PORT HTTP リクエストを受信するポート。

app.yaml で、追加の構成変数を設定できます。

メタデータ サーバー

アプリケーションのインスタンスは、ホスト名、外部 IP アドレス、インスタンス ID、カスタム メタデータ、サービス アカウント情報など、インスタンスに関する情報を Compute Engine メタデータ サーバーから取得します。App Engine では、インスタンスごとにカスタム メタデータを設定することはできませんが、プロジェクト単位のカスタム メタデータを設定して、App Engine インスタンスや Compute Engine インスタンスから読み取ることができます。

次のサンプル関数では、メタデータ サーバーを使用して PHP バージョン 7.3 以前のインスタンスの外部 IP アドレスを取得します。PHP 7.4 以降については、PHP ランタイムのセクションの例をご覧ください。

function get_external_ip_using_google_cloud()
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $externalIp = $metadata->get(
        'instance/network-interfaces/0/access-configs/0/external-ip');

    return $externalIp;
}

function get_external_ip_using_curl()
{
    $url = 'http://metadata.google.internal/computeMetadata/v1/' .
        'instance/network-interfaces/0/access-configs/0/external-ip';

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