PHP とGoogle App Engineを使ったウェブアプリケーションの開発をする手順については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.yaml
とappcfg.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 ランタイムでは以下の拡張が有効になっています:
php.ini
を設定してPHP 5.5異常を使用してるアプリケーションでは、以下の拡張を動的に読み込むことができます。
これらの拡張を有効にするには、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のようなストレージサービスを使用したほうが良いでしょう。
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 を使用するので、課金を有効にしたアプリでのみ使用できます。
gethostname()
を除く全ての ネットワーク関数以下の PHP I/O ストリームラッパー がサポートされています:
fopen()
やfile_get_contents()
のようなPHPの多くの関数は、異なるプロトコルをサポートするためにPHPのストリームインタフェースを使用します。
以下は、App Engine ランタイムで自動的に登録されて使用できる内蔵ストリームラッパーの一覧です。
file://
http://
(これは PHPの内蔵 http ストリームハンドラのように動作しますが、 App Engine のURLフェッチサービスを使用しています)https://
(これはApp Engine のURLフェッチサービスを使用しています)gs://
(Google クラウドストレージ用のストリームハンドラ)zlib://
ftp://
以下は、Google App Engineでサポートされていないため登録されていない内蔵ストリームラッパーの一覧です。
data://
phar://
ssh2://
rar://
ogg://
expect://
以下のストリーム転送は無効になっています。
ssl
sslv2
sslv3
tcp
tls
udg
udp
unix
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_multi_*
関数cURL "lite"を使用する前には、それを アプリケーションのphp.ini ファイルで有効にしなければなりません。
完全なcURL と cURL Liteのどちらを使用するかをあなたが使用したいcURL 関数とcURL 関数が影響を受けるサービス(Sockets や URLFetch)を基に決めることで、 関数と割り当て量のベストな組み合わせを得られるでしょう。
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.
App Engine PHP SDK にはあなたのアプリケーションのテストやアプリケーションファイルのアップロードを行うためのツールが含まれています。
このGitHub リポジトリ: https://github.com/GoogleCloudPlatform/appengine-phpで App EngineのPHPインタプリタのソースコードをダウンロードできます/p>