PHP ランタイム

概要

PHP ランタイムは、アプリケーションのコードと依存関係をインストールして実行するソフトウェア スタックです。このフレキシブル ランタイムは、app.yaml 内で次のように宣言されています。

runtime: php
env: flex

フレキシブル環境のランタイムは、Docker を使用してビルドされています。PHP ランタイムは、Ubuntu 16.04 をベースとしています。PHP ランタイムのソースコードは GitHub で公開されています。

PHP バージョンの選択

デフォルトでは、PHP ランタイムは PHP 7.2 を使用しますが、新しいバージョンの PHP が利用可能になったときにアプリケーションが自動的にアップグレードされないように、composer.json ファイルに PHP のバージョンを明示的に宣言する必要があります。PHP バージョン 5.6.*7.0.*7.1.* もサポートされています。

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

OPcache

デフォルトでは、ランタイムに OPcache がコンパイルされ、有効になります。

OPcache の設定方法については、公式のドキュメントをご覧ください。

OPcache を無効にするには、次の行を含む php.ini ファイルを作成するか、この行をファイルに追加します。

opcache.enable=0

依存関係

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

PHP 拡張機能の使用

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

次の PHP 拡張機能は共有としてコンパイルされますが、デフォルトでは無効になっています。

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

; 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 5.6 では Suhosin Security 拡張機能がインストールされ、デフォルトではシミュレーション モードに設定されています。シミュレーション モードでは、危険性のある関数の使用がログに記録されます。この記録は 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 を呼び出すと、警告がスローされ、関数は呼び出されません。

ドキュメント ルートの宣言

アプリケーションにドキュメント ルートを宣言する必要があります。この設定は app.yaml で行います。

runtime: php
vm: true
api_version: 1

runtime_config:
  document_root: web

.(ドット)を使用するとプロジェクト ディレクトリ全体を指定できますが、この方法はおすすめしません。

NGINX のカスタマイズ

nginx-app.conf 設定ファイルは、メインの NGINX 設定ファイルの server セクションに含まれています。デフォルトの設定ファイルは次のようになります。

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.yamlruntime_config セクションで変更できます。

runtime: php
env: flex

runtime_config:
  document_root: web
  front_controller_file: app.php

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

App Engine フレキシブル環境では、supervisord でプロセスを管理します。デフォルトでは、supervisord は nginx と php-fpm を実行して PHP ウェブ アプリケーションを実行します。ただし、一部のアプリケーションでは外部プロセスを実行する必要があります。また、このようなアプリケーションでは、nginx や php-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

nginx と php-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

ランタイムの拡張

フレキシブル環境の PHP ランタイムを使用して、カスタム ランタイムを作成できます。カスタム ランタイムは Dockerfile を介して設定されます。gen-config を使用すると、PHP ランタイムに基づいて Dockerfile を生成できます。

gcloud beta app gen-config --custom

Dockerfile.dockerignore を必要に応じてカスタマイズします。最後に、app.yamlruntime: php の代わりに runtime: custom を指定します。詳細については、PHP ランタイムのカスタマイズをご覧ください。

環境変数

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

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

その他の環境変数は app.yaml で設定できます。

メタデータ サーバー

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

次のサンプル関数では、メタデータ サーバーからインスタンスの外部 IP アドレスを取得します。

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);
}
このページは役立ちましたか?評価をお願いいたします。

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

PHP の App Engine フレキシブル環境に関するドキュメント