サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

PHP ランタイム環境

  1. PHP のランタイムを選択する
  2. サンドボックス
  3. クラスの自動読み込み
  4. 有効な拡張
  5. 動的に読み込み可能な拡張
  6. セッション
  7. 特別な $_SERVER キー
  8. 新たに初期既定値を持つディレクティブ
  9. 無効となっている関数
  10. ストリームのサポート
  11. App Engine上でのHTTPリクエストとcURLサポート
  12. 純正PHP
  13. PHP SDK とツール
  14. PHP インタプリタのソースコード

PHP とGoogle App Engineを使ったウェブアプリケーションの開発をする手順についてはPHP 入門ガイドを参照してください。



PHP のランタイムを選択する

PHP SDK付属のappcfg.pyという名前のツールを使ってapp.yamlという名前のファイルを設定することで、 あなたのアプリケーションコードで使うPHPランタイム環境をApp Engineに通知できます。

app.yamlファイルで runtime エレメントを設定します:


runtime: php55
api_version: 1
...

最初のエレメント runtimeでは、PHP ランタイム環境を選びます。

二つ目のエレメント api_versionでは、使用するPHPランタイム環境のバージョンを選びます。 この記事を書いている時点では、 App Engineが持っているPHP 環境はバージョン1の一つだけです。 App Engineの開発チームが既存のコードと互換性のない環境への変更をリリースする必要がある場合に、このバージョン情報を新しくしたうえで変更を行います。 アプリのapi_version設定を変更してアップロードするまでは、アプリは選択したバージョンのラインタイムを使い続けます。

app.yamlappcfg.pyに関する詳細情報については、PHP アプリケーション設定アプリをアップロードするを参照してください。



サンドボックス

複数のウェブサーバーにまたがったアプリケーションへのリクエストを分散し、アプリケーションが別のアプリケーションへ干渉しないようにするために、 App Engineでは制限された"サンドボックス"環境内でアプリケーションを実行させます。 この環境では、アプリケーションはコードを実行し、App Engineデータストア内でデータを保存したり呼び出したり、App EngineメールやURLフェッチやUsers サービスを使用したり、ユーザーのウェブリクエストを精査して応答の準備をしたりできます。

App Engine アプリケーションでは以下のことができません:

  • ファイルシステムへの書き込み。PHP アプリケーションは永続的なファイルを保存するためにGoogle クラウドストレージを使用できます。 ファイルシステムからの読み込みは可能で、アプリケーションと一緒にアップロードされた全てのファイルも読み込み可能です。

  • ゆっくり応答する。アプリケーションへのウェブからのリクエストは、数秒以内に処理されなければなりません。 応答にかなり時間がかかるプロセスは、ウェブサーバーへの負荷を避けるために終了されます。

  • 他の種類のシステムコールを作成する。



クラスの自動読み込み

標準PHP ライブラリ (SPL) クラスと App Engine用 PHP SDKの一部クラスは必要な時に自動的に読み込まれます。 これは、PHP スクリプトの上部に includeステートメントやrequireステートメントを使用する必要がないということです。

既定では、クラスの自動読み込みはApp Engine PHP SDK のルートにあるファイルで定義されたクラスでのみ発生します。 (and, if it has been specified by --php_executable_path, your local PHP installation).

To add more paths to be searched for automatic class loading, use set_include_path in your PHP script.


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



有効な拡張

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

  • apc
  • bcmath
  • calendar
  • Core
  • ctype
  • date
  • dom
  • ereg
  • filter
  • FTP
  • gd
  • hash
  • iconv
  • json
  • libxml
  • mbstring
  • mcrypt
  • memcache
  • memcached
  • mysql
  • mysqli
  • mysqlnd
  • OAuth
  • openssl
  • pcre
  • PDO
  • pdo_mysql
  • Reflection
  • session
  • shmop
  • SimpleXML
  • soap
  • SPL
  • standard
  • tokenizer
  • xdebug (included with SDK)
  • xml
  • xmlreader
  • xmlwriter
  • Zip
  • zlib


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

php.iniを設定してPHP 5.5異常を使用してるアプリケーションでは、以下の拡張を動的に読み込むことができます。

  • cURL - この拡張は socket サービス を使ってリクエストを作成し、 そのサービスの割り当て量と制限の影響を受けます。課金を有効にしたアプリケーションでのみ使用できます。
  • MongoDB - この拡張を使うことで、開発者は既存の MongoDB インスタンスに接続できます。これは socket サービス を使ってリクエストを作成し、 そのサービスの割り当て量と制限の影響を受けます。課金を有効にしたアプリケーションでのみ使用できます。
  • ImageMagick
  • intl

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


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



セッション

ほとんどのウェブアプリケーションでは、リクエスト間でユーザー情報を保存しておくための方法が必要です。 PHP では便利なセッション管理レイヤーが使用できます。 App Engineでのセッションは他のPHPアプリケーションと同じように動作します。

ユーザーのセッションで変数を設定します:


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

同じユーザーの後続リクエストで:


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

既定では、 App Engine ランタイムはMemcacheSessionHandler クラスを使ってメモリキャッシュにセッション情報を保存します。 PHPのsession_set_save_handler() メソッドを使ってセッションハンドラを設定し、 この動作を調整できます。 メモリキャッシュを使うことでセッションデータの保存や検索がすばや行えるようになり、あなたのリクエストでのオーバヘッドが最小限に抑えられます。 しかしApp Engineメモリキャッシュ内のデータは定期的にクリアされるので、セッション情報が失われる可能性があります。 セッションを長く維持する必要がある場合は、代わりに Cloud SQLのようなストレージサービスを使用したほうが良いでしょう。



特別な $_SERVER キー

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

  • APPLICATION_ID - アプリが作成された時にアプリケーションの app_id を設定します。例えば、 my-wordpress
  • AUTH_DOMAIN - Users APIでユーザーを認証するのに使用されるドメイン。appspot.com でホストされているアプリは AUTH_DOMAIN にgmail.comの値を持っており、 and accept any Google account. Google Apps を使ったカスタムドメインでホストされているアプリはカスタムドメインに等しい AUTH_DOMAIN を持っています。
  • CURRENT_VERSION_ID - 現在動作しているアプリケーションのメジャーバージョンとマイナーバージョンを "X.Y"形式で表します。 メジャーバージョンの数字("X")はアプリのapp.yaml ファイルで設定します。マイナーバージョンの数字("Y")はアプリがApp Engineにアップロードされた時に自動的に設定されます。 デベロップメントウェブサーバでは、マイナーバージョンは常に "1"となります。
  • DEFAULT_VERSION_HOSTNAME - アプリケーションの既定バージョンのホスト名。例えば、 my-php-app.appspot.com.
  • HTTP_X_APPENGINE_CITY - リクエストが発生した都市の名前。例えば、Mountain Viewの都市から発生したリクエストは、mountain viewのヘッダ値を持つでしょう。
  • HTTP_X_APPENGINE_CITYLATLONG - リクエストが発生した都市の経度と緯度。Mountain Viewから発生したリクエストの場合、この文字列は "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 - ユーザーがUsers APIを使って認証されている場合は、ユーザーのEメールアドレスを返します。OpenIDを使用している場合は、このEメールに依存した仕様にしないでください。アプリケーションではニックネームを表示名に使用ください。
  • USER_ID - Eメールアドレスが Google アカウントに関連付けられている場合、 user_id の値はユニークで変わることのないユーザーID(str型)になります。 ユーザーがUsers APIを使って認証されている場合は、ユーザーがEメールアドレスを変更するかどうかに関係なく、このIDはそのユーザーについては常に同じ値になります。
  • USER_IS_ADMIN - ユーザーがUsers APIを使って認証されている場合、ログインユーザーがプリケーションの管理者でもある場合は1 になります。そうでなければ0になります。
  • USER_NICKNAME - For Google Accounts users, the nickname is either the "name" portion of the user's email address if the address is in the same domain as the application, or the user's full email address otherwise. OpenID ユーザーについては、ニックネームはOpenID の識別子です。
  • USER_ORGANIZATION - Google アカウント設定を使用しているアプリケーションで、 ログインユーザーが現在個人のGoogle アカウントをしようしているのか Google Appsドメインで管理しているアカウントを使用しているのか判別します。


新たに初期既定値を持つディレクティブ

この表は、php.netから入手できる標準PHP 5.5インタプリタで実装された既定値とは違う初期既定値を持つディレクティブです。 あなたのアプリケーションのphp.iniファイルでこれらをインクルードすることでこれらの既定ディレクティブを上書きできます。

ディレクティブ Google 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


無効となっている関数

セキュリティ上の理由やGoogle App Engine 実行環境との互換性ために、いくつかのPHP関数は無効になっています。 これらの関数のいくつかは、あなたのアプリケーションのphp.iniファイルで明示的に再有効化することができます。



永続的に無効となっている関数

以下の関数は、Google 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()

Google App Engine は pcntl モジュールをインクルードしません。 したがって、pcntlで提供される関数は Google App Engine上で動作するPHP@うろグラムでは使用できません。



tempnam()sys_get_temp_dir() のサポート

App Engine アプリは、自身のファイルスペースに直接ファイル書き込みができない安全なサンドボックス内で動作します。 (その代わり、ファイルの保存はGoogle Cloud Storage bucketsで行えます。)

このため、 App Engine版のtempnam() では、メモリ内の一時ファイルを返します。 この一時ファイルは後で永続ストレージに書き込むことができます。

以下の例では、 メモリ内に"foo"のプレフィックスを付けた一時ファイルを生成し、既定のGoogle Cloud Storage bucketへ書き込み (by using file_put_contents(), which automatically calls out to GCS under the hood)、"hello"の文字を追加しています。 それからこのファイルを再度開き、" world"の文字を追加し、閉じています。 最後に、このファイルの中身を画面に表示します。


<?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);

上記の echo呼び出しで想定される出力は、以下のようになります:


hello world



部分的に制限された関数

PHP ランタイム用 Google App Engine ではpreg_replace()関数と mb_ereg_replace()関数の /eパターン修飾子をサポートしていません。 これの非推奨通知と代わりにpreg_replace_callback() を使ってコードを更新する方法については、 PREG_REPLACE_EVAL のドキュメントを参照してください。



手動で有効にできる関数

以下の一覧は、あなたのアプリケーションのphp.ini ファイルのgoogle_app_engine.enable_functions ディレクティブを使って手動で有効にする必要があるPHP 関数です。

  • gc_collect_cycles(), gc_enable(), gc_disable(), and gc_enabled()
  • getmypid()
  • getmyuid() and 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


ストリームラッパー

fopen()file_get_contents()のようなPHPの多くの関数は、異なるプロトコルをサポートするためにPHPのストリームインタフェースを使用します。

以下は、App Engine ランタイムで自動的に登録されて使用できる内蔵ストリームラッパーの一覧です。

以下は、Google App Engineでサポートされていないため登録されていない内蔵ストリームラッパーの一覧です。

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


無効なストリーム転送

以下のストリーム転送は無効になっています。

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


App Engine上でのHTTPリクエストとcURLサポート

PHP 言語では、リモートHTTPリクエストを作成するためのいくつかの関数が用意されています。 これらの関数はGoogle App Engine上ではそれぞれ異なったやり方で実装されており、異なる割り当て量と費用の対象となります。

  • 開発者は http://https://といったPHP ストリームハンドラを使用できます。 このハンドラはApp Engineの URL フェッチサービス を使用してHTTPリクエストを作成するように設定されているので、 URL fetch serviceの割り当て量と制限の対象となります。 file_get_contents()のような多くのPHP関数は、適切なURLが渡された時にhttp://https://といったストリームハンドラを使用するため、URL fetch serviceも使用しています。
  • 開発者は cURL 拡張 を使って HTTP リクエストを作成できます。 cURL 拡張を使うためには、あなたのアプリケーションの php.ini fileでcURL を有効にし、さらにアプリの課金を有効にする必要があります。 cURL 拡張は Sockets サービス を使用しており、 Socket サービスの割り当て量と制限の対象となります。
  • 開発者は必要に応じて cURL "lite"を使用できます。これはGoogleが提供するバージョンのcURL ライブラリで、Sockets サービスの代わりにURLフェッチサービス を使用しています。 cURL "lite" は URLフェッチサービスの割り当て量と制限の対象となります。完全な cURLと違い、 cURL "lite" ではcURL 拡張の以下メソッドをサポートしていません:
    • curl_multi_* 関数
    • 非標準プロトコルのサポート
    • 80 (HTTP) や 443 (HTTPS)以外宛のポートのサポート

cURL "lite"を使用する前には、それを アプリケーションのphp.ini ファイルで有効にしなければなりません。

完全なcURL と cURL Liteのどちらを使用するかをあなたが使用したいcURL 関数とcURL 関数が影響を受けるサービス(Sockets や URLFetch)を基に決めることで、 関数と割り当て量のベストな組み合わせを得られるでしょう。



純正PHP

PHP ランタイム環境向けの全てのコードは純正 PHPでなければなりません。 App Engine ではあなた独自のC拡張はアップロードできません。

この環境では PHP 5.5 標準ライブラリがインクルードされています。ネットワーク処理やファイルシステムへの書き込みといったコア関数が App Engineでサポートされていないため、 いくつかのモジュールは無効になっています。

アプリケーションディレクトリにコードを設置することで、あなたのアプリケーションに他の純正PHPライブラリをインクルードできます。 アプリケーションディレクトリ内でモジュールのディレクトリへのシンボリックリンクを作成した場合は、 appcfg.py はそのリンクに従ってあなたのアプリにモジュールをインクルードします。

The PHP module include path includes your application's root directory (the directory containing the app.yaml file). Modules you create in your application's root directory are available using a path from the root.



PHP SDK とツール

App Engine PHP SDK にはあなたのアプリケーションのテストやアプリケーションファイルのアップロードを行うためのツールが含まれています。



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

このGitHub リポジトリ: https://github.com/GoogleCloudPlatform/appengine-phpで App EngineのPHPインタプリタのソースコードをダウンロードできます/p>