PHP 5 ランタイム環境

App Engine では、PHP プログラミング言語を使用してウェブ アプリケーションを構築できます。作成した PHP アプリケーションは、Google のスケーラブルなインフラストラクチャ上で動作し、大規模な永続的ストレージとサービスを利用します。

PHP ランタイムの選択

App Engine は PHP バージョン 5.5.34 インタープリタを使用して PHP ウェブ アプリケーションを実行します。注: Linux では、PHP アプリを実行するために PHP をローカルにインストールする必要があります。

PHP ランタイムを使用するようにアプリを設定するには、app.yaml ファイルに次の行を追加します。

runtime: php55
api_version: 1
...

最初の要素 runtime は、PHP ランタイム環境を選択します。

2 番目の要素 api_version は、使用する PHP ランタイム環境のバージョンを選択します。現時点では、App Engine でサポートされる PHP 環境のバージョンは 1 のみです。将来の変更によって下位互換性がなくなる可能性がある場合、App Engine チームは新しいバージョン識別子を使用します。api_version 設定を変更してアプリをアップロードするまで、アプリは選択したバージョンを使用できます。

app.yaml ファイルの詳細と App Engine にアプリをデプロイする方法については、app.yaml リファレンスPHP アプリのデプロイをご覧ください。

サンドボックス

App Engine が複数のアプリケーションへのリクエストを複数のウェブサーバーに分散できるようにして、アプリケーションが相互に干渉しないようにするために、アプリケーションは制限された「サンドボックス」環境で実行されます。この環境でアプリケーションは、コードの実行、App Engine のメールサービス、URL Fetch サービス、ユーザー サービスの使用、ユーザーのウェブ リクエストの調査とレスポンスの準備を行うことができます。

App Engine アプリケーションでは、次のことはできません。

  • ファイルシステムへの書き込み。永続データを格納するには、PHP アプリケーションで Google Cloud Storage を使用できます。ファイルシステムからのファイルの読み取りは可能です。また、アプリケーションでアップロードされたアプリケーション ファイルはすべて利用可能です。

  • 遅いレスポンス。アプリケーションへのウェブ リクエストは、数秒以内に処理される必要があります。レスポンスまでに非常時に長い時間がかかるプロセスは、ウェブサーバーの過負荷を防ぐために終了します。

  • その他の種類のシステムコールの実行。

クラスの自動読み込み

標準 PHP ライブラリ(SPL)クラスと App Engine 用 SDK の一部であるクラスの両方が、必要に応じて自動的に読み込まれます。つまり、PHP スクリプトの先頭で include ステートメントや require ステートメントを使用する必要はありません。

デフォルトでは、クラスの自動読み込みは、App Engine 用 SDK ルート(--php_executable_path で指定されている場合は、ローカルにインストールされている PHP)のルート ディレクトリにあるファイルで定義されたクラスに対してのみ行われます。

クラスの自動読み込みで使用する検索パスを追加するには、PHP スクリプトで set_include_path を使用します。

set_include_path('my_additional_path' . PATH_SEPARATOR . get_include_path());

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

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

  • apc
  • bcmath
  • calendar
  • Core
  • ctype
  • date
  • dom
  • ereg
  • exif
  • filter
  • ftp
  • gd
  • hash
  • iconv
  • json
  • libxml
  • mailparse
  • mbstring
  • mcrypt
  • memcache
  • memcached
  • mysql
  • mysqli
  • mysqlnd
  • OAuth
  • openssl
  • pcre
  • PDO
  • pdo_mysql
  • Reflection
  • session
  • shmop
  • SimpleXML
  • soap
  • sockets(課金が有効なアプリの場合)
  • SPL
  • standard
  • tokenizer
  • xml
  • xmlreader
  • xmlwriter
  • xsl
  • zip
  • zlib

動的に読み込み可能な拡張機能

次の拡張機能は、php.ini を構成することで動的に読み込むことができます。

  • cURL - この拡張機能はソケット サービスを使用してリクエストを行い、そのサービスの割り当てと制限が適用されます。詳細については、送信リクエストをご覧ください。
  • MongoDB - この拡張機能使用すると、デベロッパーは既存の MongoDB インスタンスに接続できます。この拡張機能はソケット サービスを使用してリクエストを行い、そのサービスの割り当てと制限が適用されます。
  • ImageMagick
  • intl
  • fileinfo

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

extension = "curl.so"
extension = "mongo.so"
extension = "imagick.so"
extension = "intl.so"
extension = "fileinfo.so"

セッション

多くのウェブ アプリケーションでは、ユーザーの状態情報をリクエスト間で維持する方法が必要です。PHP には便利なセッション管理レイヤが用意されています。App Engine のセッションは、他の PHP アプリケーションのセッションと同様に動作します。

ユーザーのセッションで以下のように変数に設定します。

session_start();
$_SESSION['Foo'] = 'Bar';

同じユーザーから次のリクエストが送信されると、以下のようになります。

session_start();
print $_SESSION['Foo']; // prints Bar

App Engine ランタイムは、デフォルトでは Memcache の MemcacheSessionHandler クラスを使用してセッション情報を保存します。この動作を調整するには、PHP の session_set_save_handler() メソッドを使用して独自のセッション ハンドラを指定します。Memcache ではセッション データの保存と取得が瞬時にできるので、リクエストのオーバーヘッドが最小限に抑えられます。ただし、App Engine の memcache のデータは定期的にフラッシュされるため、セッション情報が失われる可能性があります。長期間にわたるセッションでは、Cloud SQL などの別のストレージ サービスを使用することをおすすめします。

$_SERVER の特別なキー

PHP では、リクエストのスコープで特別な $_SERVER[] 配列を使用できます。App Engine では、標準の CGI パラメータの他にも有用なキーがいくつか追加されています。

  • APPLICATION_ID - アプリの作成時に設定されるアプリケーションの app_id(my-wordpress など)。
  • AUTH_DOMAIN - Users API でユーザーを認証するために使用されるドメイン。appspot.com でホストされているアプリには gmail.com の AUTH_DOMAIN が割り当てられ、どの Google アカウントでも受け入れます。Google Workspace を使用してカスタム ドメイン上でホストされているアプリには、カスタム ドメインと同じ AUTH_DOMAIN が割り当てられます。
  • CURRENT_VERSION_ID - 「X.Y」のような現在実行中のアプリケーションのメジャー バージョンとマイナー バージョン。メジャー バージョン番号(「X」)はアプリの app.yaml ファイルで指定されます。マイナー バージョン番号("Y")は、アプリの各バージョンが App Engine にアップロードされたときに自動的に設定されます。開発用ウェブサーバーでは、マイナー バージョンは常に「1」です。
  • DEFAULT_VERSION_HOSTNAME - このアプリケーションのデフォルト バージョンのホスト名(例: my-php-app.uc.r.appspot.com)。
  • 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_REGION - リクエストの発生元の地域の名前。この値は、X-Appengine-Country の国のコンテキストでのみ意味があります。たとえば、国が「US」でリージョンが「ca」の場合は、この「ca」はカナダではなく「カリフォルニア州」を意味します。
  • USER_EMAIL - ユーザー API を使用して認証されたユーザーのメールアドレスを返します。アプリケーションで表示可能な名前にニックネームを使用する必要があります。
  • USER_ID - メールアドレスが Google アカウントに関連付けられている場合、user_id はユーザーの一意の永続 ID(str)を返します(Users API を使用して認証されている場合)。この ID は、ユーザーが自分のメールアドレスを変更したかどうかにかかわらず、常に同じです。
  • USER_IS_ADMIN - ユーザーがアプリケーションの管理者である場合は 1、管理者でない場合は 0(Users API で認証されている場合)。
  • USER_NICKNAME - Google アカウントのユーザーの場合、ユーザーのメールアドレスの名前の部分(アドレスがアプリケーションと同じドメインにある場合)がニックネームとして使用され、そうでない場合はメールアドレス全体がニックネームとして使用されます。
  • USER_ORGANIZATION - Google アカウント設定を使用するアプリケーションは、現在ログインしているユーザーが個人用 Google アカウントを使用しているか、Google Workspace ドメインで管理されているアカウントを使用しているかを判断できます。

1.9.0 でアップデートされた PHP_SELFSCRIPT_NAME の動作

1.9.0 より前の $_SERVER['SCRIPT_NAME']$_SERVER['PHP_SELF'] の実装は、1.9.0 以降と大きく異なります。この変更は、PHP アプリケーションによって通常期待される Apache 実装との一貫性を図るために行われました。

次の例は、この違いを示しています。

1.9.0 より前1.9.0 以降

app.yaml:

- url: /.*
  script: index.php
REQUEST_URI: /
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /
      PHP_SELF: /
REQUEST_URI: /
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /index.php
PHP_SELF: /index.php
REQUEST_URI: /bar
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /bar
PHP_SELF: /bar
REQUEST_URI: /bar
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /index.php
PHP_SELF: /index.php
REQUEST_URI: /index.php/foo/bar
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /index.php/foo/bar
PHP_SELF: /index.php/foo/bar
REQUEST_URI: /index.php/foo/bar
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /index.php
PHP_SELF: /index.php/foo/bar
REQUEST_URI: /test.php/foo/bar
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /test.php/foo/bar
PHP_SELF: /test.php/foo/bar
REQUEST_URI: /test.php/foo/bar
SCRIPT_FILENAME: /path/to/index.php
SCRIPT_NAME: /index.php
PHP_SELF: /index.php

app.yaml:

- url: /.*
  script: foo/index.php
REQUEST_URI: /bar
SCRIPT_FILENAME: /path/to/foo/index.php
SCRIPT_NAME: /bar
PHP_SELF: /bar
REQUEST_URI: /bar
SCRIPT_FILENAME: /path/to/foo/index.php
SCRIPT_NAME: /foo/index.php
PHP_SELF: /foo/index.php

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

次の表に、php.net から入手できる標準 PHP インタープリタのデフォルトと異なる初期化デフォルト値を持つディレクティブを示します。これらのデフォルトのディレクティブは、アプリケーションの php.ini ファイルにディレクティブを含めることでオーバーライドできます。

ディレクティブ App Engine のデフォルト値
detect_unicode false
session.gc_maxlifetime 600
session.cookie_secure 600
session.cookie_httponly 1
session.use_only_cookies 1
display_errors 0
display_startup_errors 0
html_errors 0
log_errors 1
file_uploads 0
upload_max_filesize 262144
max_file_uploads 0
date.timezone UTC
sendmail_path null
allow_url_fopen 1
allow_url_include 0
enable_dl 0
expose_php Off
register_globals Off
magic_quotes_gpc 0
mysqlnd.collect_statistics 0
mysql.allow_local_infile 0
mysqli.allow_local_infile 0

無効になっている関数

セキュリティ上の理由、または App Engine 実行環境との互換性のために、一部の PHP 関数が無効になっています。一部の関数については、アプリケーションの php.ini で指定することで再び有効にできます。

有効にできない関数

次の関数は App Engine で永続的に無効になっています。

  • disk_free_space()
  • disk_total_space()
  • diskfreespace()
  • escapeshellarg() and escapeshellcmd()
  • exec()
  • highlight_file()
  • lchgrp(), lchown(), link(), and symlink()
  • passthru()
  • pclose() and popen()
  • proc_close(), prog_get_status(), proc_nice(), proc_open(), and proc_terminate()
  • set_time_limit()
  • shell_exec()
  • show_source()
  • system()

App Engine には pcntl 拡張機能が含まれていません。したがって、pcntl によって提供される関数は、App Engine で実行されている PHP アプリでは使用できません。

tempnam()sys_get_temp_dir() のサポート

App Engine アプリは、ローカルのファイル システムへの書き込みが許可されないセキュリティ サンドボックスで動作します。このため App Engine バージョンの tempnam() は、Google 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

利用上の制限がある関数

PHP 用 App Engine ランタイムでは、preg_replace() 関数と mb_ereg_replace() 関数の /e パターン修飾子がサポートされていません。サポート終了のお知らせと、preg_replace_callback() を使用してコードを更新する方法については、PREG_REPLACE_EVAL のドキュメントをご覧ください。

手動で有効にできる関数

このリストで指定されている PHP 関数は、アプリケーションの php.ini ファイルで google_app_engine.enable_functions ディレクティブを使用して手動で有効にする必要があります。

  • gc_collect_cycles()gc_enable()gc_disable()gc_enabled()
  • getmypid()
  • getmyuid()getmygid()
  • getrusage()
  • getmyinode()
  • get_current_user()
  • libxml_disable_entity_loader()*
  • parse_str()
  • phpinfo()
  • phpversion()
  • php_uname()
  • php_sapi_name()

アプリケーションの php.ini ファイルで disable_functions ディレクティブを使用して、関数を手動で無効にすることもできます。

課金を有効にする必要がある関数

次の関数では Sockets を使用するため、課金が有効なアプリでのみ使用できます。

ストリームのサポート

サポートされている PHP I/O ストリーム ラッパー

次の PHP I/O ストリーム ラッパーがサポートされています。

  • php://input
  • php://output
  • php://memory
  • php://temp

ストリーム ラッパー

PHP の多くの関数(fopen()file_get_contents() など)は、PHP のストリーム インターフェースを利用して、さまざまなプロトコルをサポートします。

次のリストは、自動的に登録されて App Engine ランタイムで使用できる組み込みストリーム ラッパーを示しています。

  • file://
  • glob://
  • http://(この動作は PHP の組み込み http ストリーム ハンドラと似ていますが、App Engine の URLfetch サービスを使用します)
  • https://(これは App Engine の URLfetch サービスを使用します)
  • ftp://
  • gs://Google Cloud Storage 用のストリーム ハンドラです)
  • zlib://

次のリストは、App Engine ではサポートされず、登録されていない組み込みのストリーム ハンドラを示しています。

  • data://
  • expect://
  • ogg://
  • phar://
  • rar://
  • ssh2://

ストリームのトランスポート層

以下のストリーム トランスポート層は無効になっています。

  • ssl
  • sslv2
  • sslv3
  • tcp
  • tls
  • udg
  • udp
  • unix

純粋な PHP

PHP ランタイム環境で使用されるコードは、すべて純粋な PHP である必要があります。App Engine では独自の C の拡張機能をアップロードすることはできません。

ここで言う環境には PHP 標準ライブラリが含まれます。一部の拡張機能は、コア関数が App Engine でサポートされないため、無効になっています(ネットワーク接続やファイル システムへの書き込みなど)。

アプリケーションに他の純粋な PHP ライブラリを追加するには、アプリケーションのディレクトリにコードを配置します。このディレクトリは、app.yaml ファイルが含まれているのと同じディレクトリです。

たとえば、アプリケーションのディレクトリにライブラリのディレクトリを指すシンボリック リンクを作成できます。そのリンクが参照されて、App Engine にデプロイするアプリケーションにライブラリが含まれるようになります。

また、php.ini ディレクティブを指定し、コードに include ステートメントを含めることによって、PHP ライブラリを含めることも可能です。ただし、それよりも Composer などの PHP 依存関係管理ツールを使用することをおすすめします。

例:

  • アプリケーションのルート ディレクトリを php.ini ファイル内の include_path ディレクティブに追加する場合は、次のようになります。

    include_path=".:/[ROOT_DIR]/myapp"
    

    include ステートメントまたは include_once ステートメントを使用して、include_path に関連する PHP ファイルを含めることができます。

    include_once 'myfile.php';
    
  • Composer を使用して純粋な PHP ライブラリを含めることを選択した場合、依存関係がインストールされた後に単一のファイルを含めることができます。

    require_once 'vendor/autoload.php';
    

    Composer を使用してアプリケーションの依存関係をインストールすると、autoload.php ファイルが生成される vendor の下にあるアプリケーションのディレクトリにすべてのパッケージが追加されます。

ツール

SDK for App Engine には、アプリケーションのテストとアプリケーション ファイルのアップロードのためのツールが含まれています。

開発用サーバーを使用すると、ローカルのパソコン上でアプリケーションを実行して、アプリケーションをテストできます。

gcloud ツールにより、App Engine で動作しているアプリケーションに対するすべてのコマンドライン操作が処理されます。gcloud app deploy を使用して、アプリケーションを App Engine にアップロードできます。また、個々の構成ファイルを更新することもきます。また、アプリのログデータを表示して、独自のツールでアプリのパフォーマンスを分析することもできます。

PHP インタープリタのソースコード

App Engine の PHP インタープリタのソースコードを GitHub の appengine-php リポジトリからダウンロードできます。

同時実行とレイテンシ

トラフィックに対処するために必要なインスタンスの数に特に大きく影響するのはアプリケーションのレイテンシです。リクエストを短時間のうちに処理できるサービスであれば、1 つのインスタンスで多くのリクエストを処理できます。

環境変数

ランタイムは以下の環境変数を設定します。

環境変数 説明
GAE_APPLICATION App Engine アプリケーションの ID。この ID の先頭には「region code~」が付きます。たとえば、ヨーロッパでデプロイされたアプリケーションの場合は「e~」となります。
GAE_DEPLOYMENT_ID 現在のデプロイの ID。
GAE_ENV App Engine の環境。standard に設定します。
GAE_INSTANCE 現在サービスが実行されているインスタンスの ID。
GAE_RUNTIME app.yaml ファイル内で指定したランタイム。
GAE_SERVICE app.yaml ファイル内で指定したサービス名。サービス名が指定されていない場合は、default に設定されます。
GAE_VERSION サービスの現在のバージョン ラベル。
GOOGLE_CLOUD_PROJECT アプリケーションに関連付けられた Google Cloud プロジェクト ID。
PORT HTTP リクエストを受信するポート。

app.yaml ファイル内で追加の環境変数を定義できますが、上記の値をオーバーライドすることはできません。