このページでは、App Engine スタンダード環境用の PHP ランタイムにバンドル サービスをインストールして使用する方法について説明します。アプリを使用すると PHP 用 App Engine サービス SDK を介してバンドル サービスにアクセスできます。
始める前に
PHP ランタイムで呼び出すことができる、以前のバンドル サービス API のリストをご覧ください。
app.yaml
ファイルを更新して次の行を追加します。app_engine_apis: true
PHP アプリをテストするには、
gcloud app deploy
を使用してアプリをデプロイする必要があります。
PHP App Engine SDK のインストール
PHP App Engine SDK は GitHub(appengine-php-sdk
)にあります。PHP 8.1+ の場合はバージョン 2.1 以降を使用し、PHP 7.x の場合はバージョン 2.0.1 以降を使用する必要があります。
SDK をプロジェクトに組み込むには、次の 2 つの方法があります。
Packagist コマンドを実行して、
composer.json
ファイルに SDK を追加します。composer require google/appengine-php-sdk
次のように詳細を指定して
composer.json
ファイルを手動で作成します。PHP 7 / 8
{ "require": { "google/appengine-php-sdk": "^2.1" // Or any later version } }
PHP では、App Engine API に明示的な依存関係を指定する必要があります。autoload.php
を含める方法については、こちらのドキュメントをご覧ください。
ライブラリのインポート
use
演算子を使用して、使用可能な API のリストから必要なクラスをインポートします。たとえば、Google\AppEngine\Api\AppIdentity\ClassName
は、次のステートメントを使用してインポートできます。
use Google\AppEngine\Api\AppIdentity\ClassName;
移行に関する考慮事項
App Identity
PHP にアップグレードする際に、アプリの構成を変更する必要はありません。App Identity API の動作、機能、設定手順に変更はありません。詳細については、API Identity の概要と App Identity API のリファレンス ガイドをご覧ください。
PHP Mail API は PHP 5 Mail API とほぼ同じですが、メールサービスを有効または無効にする方法が少し異なります。以降のセクションでは、それぞれのランタイムの違いについて説明します。
Message クラス
PHP の Message
クラスは、use
インポートが更新されている点を除き、PHP 5.5 と同じように動作します。相違点は次のとおりです。
PHP 5.5
use google\appengine\api\mail\Message;
PHP 7 / 8
use Google\AppEngine\Api\Mail\Message;
インポート ステートメントを変更できない場合は、PHP で元の PHP 5.5 インポート ステートメントを使用できます。
Mail 関数
PHP 5.5 では、ネイティブの PHP mail()
関数は、App Engine の Mail 関数によってオーバーロードされていました。
デフォルトでは、PHP の App Engine の Mail 関数はオーバーロードされないため、明示的に有効にする必要があります。この新しい動作では、要件に合わせて Mail 関数を再利用できます。この変更により、現在すべての Mail 関数の呼び出しで、どの実装が使用されているかも把握できます。
ネイティブの PHP mail()
関数を使用して、App Engine Mail API でメールを送信する場合は、次のように php.ini
ファイルで有効にできます。
extension = mailparse.so
sendmail_path = "php ./vendor/google/appengine-php-sdk/src/Runtime/SendMail.php -t -i"
前記の例に示されているように、mailparse 拡張機能を追加して、ネイティブの PHP メール関数を有効にし、sendmail_path
ランタイム構成を App Engine Mail 関数の実装に設定します。これを有効にすると、すべての mail()
の呼び出しは PHP 5.5 とまったく同じように機能します。
詳細については、メールの送信ガイドとメールの受信ガイド、および Mail API リファレンス ガイドをご覧ください。
Memcache
PHP 用 Memcache を使用するには、Memcache ライブラリの明示的な宣言を追加する必要があります。以前の PHP 5.5 用 Memcache では明示的な宣言が必要ありませんでした。この明示的な宣言により、ネイティブの PHP Memcache と App Engine Memcache を柔軟に切り替えることができます。
明示的な宣言を除き、PHP Memcache クラスの動作は PHP 5 Memcache クラスと同じです。詳細については、Memcache の概要をご覧ください。
PHP 5.5
PHP 5.5 用 Memcache の例:
$memcache = new Memcache();
return $memcache->get($key);
PHP 5.5 用 Memcached の例:
$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
'who' => $request->get('who'),
'count' => $memcache->increment('count', 1, 0),
'host' => $request->getHost(),
]);
PHP 7 / 8
PHP 用 Memcache API の例:
use Google\AppEngine\Api\Memcache\Memcache;
$memcache = new Memcache();
return $memcache->get($key);
PHP 用 Memcached API の例:
use Google\AppEngine\Api\Memcache\Memcached;
$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
'who' => $request->get('who'),
'count' => $memcache->increment('count', 1, 0),
'host' => $request->getHost(),
]);
PHP で Memcache for PHP 5 の元の動作を使用する場合は、次のように composer.json
ファイルに行を追加し、Memcache を暗黙的に呼び出すことができます。Composer から appengine-php-sdk
パッケージをインポートした後、autoload
セクションの files
要素に次のオプトイン ファイルパスを追加します。
PHP 7 / 8
{
"require": {
"google/appengine-php-sdk": "^2.1" // Or any later version
},
"autoload": {
"files": [
"./vendor/google/appengine-php-sdk/src/Api/Memcache/MemcacheOptIn.php"
]
}
}
モジュール
PHP にアップグレードする際に、アプリの構成を変更する必要はありません。Modules API の動作、機能、設定手順に変更はありません。詳細については、モジュールの概要と Modules API リファレンス ガイドをご覧ください。
セッション
PHP セッションは、PHP 5.5 セッションと同じように動作します。ただし、PHP 5.5 セッションはデフォルトで MemcacheSessionHandler
クラスを使用するため、設定手順が異なります。
PHP セッションを使用するには、MemcacheSessionHandler
クラスを session_set_save_handler()
で登録し、Memcache に session.save_path
を構成する必要があります。また、Memcache の情報にアクセスする際に、Memcache にオプトインする必要があります。
次に例を示します。
PHP 7 / 8
ini_set('session.save_path', 'Google\AppEngine\Api\Memcache\Memcache');
session_set_save_handler(new Google\AppEngine\Ext\Session\MemcacheSessionHandler(), true);
詳しくは、Session API リファレンス ガイドをご覧ください。
タスクキュー
PHP にアップグレードする際に、アプリの構成を変更する必要はありません。タスクキューの動作、機能、設定手順に変更はありません。詳細については、タスクキューの概要ガイドのセッション セクションと Task Queue API リファレンス ガイドをご覧ください。
URL 取得
PHP 用の URL 取得を使用するには、URL 取得ライブラリの明示的な宣言を追加する必要があります。以前の PHP 5 用 URL 取得サービスでは明示的な宣言が不要であり、暗黙的に使用されていました。
PHP 5 では、App Engine の URL 取得サービスが、PHP 5.5 でインターネット コンテンツを取得する唯一の方法であったため、インターネットにアクセスしたほとんどの PHP 5.5 関数には、自動的に UrlFetch
を使用するパッチが適用されていました。
PHP では、ネイティブの PHP ネットワークがインターネットにアクセスできるため、この自動パッチの適用は行われません。場合によっては、元の UrlFetch
メカニズム、特に、使用している App Engine アプリにリクエストを行っている App Engine アプリを識別するために、X-Appengine-Inbound-Appid
リクエスト ヘッダーを提供するメカニズムを使用できます。
PHP で URL 取得を有効にするには、ストリーム ラッパーで明示的な宣言を使用するか、次のセクションで説明するように UrlFetch
クラスを直接使用します。
オプション 1a. ストリーム ハンドラ
App Engine の URL 取得サービスを有効にして、http://
と https://
の両方の PHP ストリーム ハンドラに HTTP リクエストを行えます。方法:
stream_wrapper_unregister()
を使用して、HTTP(S) 用のネイティブ PHP ストリーム ハンドラの登録を解除します。stream_wrapper_register()
を使用して、HTTP(S) をUrlFetchStream
クラスに登録します。- ストリーム ラッパーを使用する構成を使用して
file_get_contents()
を呼び出します。- URL 取得サービスからネイティブの PHP ストリーム ハンドラに戻すには、
stream_wrapper_unregister()
を使用してから、stream_wrapper_restore()
を使用して登録します。
- URL 取得サービスからネイティブの PHP ストリーム ハンドラに戻すには、
比較のため、PHP 5 と PHP が同等である例をご覧ください。
PHP 5.5
...
$context = [
'http' => [
'method' => 'POST',
'header' => $headers,
'content' => http_build_query($data),
]
];
$context = stream_context_create($context);
// Using Url Fetch service. No option to use the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;
PHP 7 / 8
use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
'http' => [
'method' => 'POST',
'header' => $headers,
'content' => http_build_query($data),
]
];
$context = stream_context_create($context);
// Using the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;
stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");
// Now using the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);
echo $result;
stream_wrapper_unregister("http");
stream_wrapper_restore("http");
// Now using the native php stream wrapper again.
オプション 1b. ストリーム ハンドラ付き HTTP レスポンス ヘッダー
ストリーム ハンドラ付き HTTP(S) レスポンス ヘッダーを使用する手順は、ストリーム ハンドラの使用方法と似ています。
stream_wrapper_unregister()
を使用して、HTTP(S) 用のネイティブ PHP ストリーム ハンドラの登録を解除します。stream_wrapper_register()
を使用して HTTP(S) をUrlFetchStream
クラスに登録します。- 必要な構成で
file_get_contents()
の代わりにfopen()
を使用します。 stream_get_meta_data()
を呼び出して、'wrapper_data
のメタデータをインデックスに登録し、レスポンス ヘッダー情報を抽出します。PHP 5.5 では、レスポンス ヘッダーは$http_response_header
のような配列形式で返されます。
PHP 5.5
...
$context = [
'http' => [
'method' => 'POST',
'header' => $headers,
'content' => http_build_query($data),
]
];
$context = stream_context_create($context);
// Using file_get_contents and the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);
// Print Http Response Headers
print_r($http_response_header);
PHP 7 / 8
use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
'http' => [
'method' => 'POST',
'header' => $headers,
'content' => http_build_query($data),
]
];
$context = stream_context_create($context);
stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");
// Now using fopen and the Url Fetch service.
$result = fopen('http://example.com', 'r', false, $context);
// Print Http Response Headers
$meta_data = stream_get_meta_data($result);
$headers = $meta_data['wrapper_data'];
print_r($headers);
stream_wrapper_unregister("http");
stream_wrapper_restore("http");
オプション 2. UrlFetch クラス
UrlFetch
クラスは、より具体的なスコープで HTTP(S) リクエストに対する URL 取得サービスの使用について、より具体的な方法を提供するカスタムクラスです。ストリーム ハンドラ オプションとは異なり、UrlFetch
クラスは、ストリーム ラッパーに互換性のある関数から行われたすべての HTTP(S) リクエストをオーバーライドして URL 取得サービスを使用するわけではありません。ストリーム ハンドラ オプションと比べると、UrlFetch
クラスの構成は、次のようなさまざまな PHP API を使用する必要がない点でもより簡単です。
stream_context_create()
stream_wrapper_unregister()
stream_wrapper_register()
file_get_contents()
次の UrlFetch
クラスの例は、ストリーム ハンドラの例に相当します。
PHP 7 / 8
use google\appengine\api\urlfetch\UrlFetch;
...
$urlfetch = new UrlFetch();
$result = $urlfetch->fetch($url, 'POST', $headers, http_build_query($data));
echo $result->getContent();
ユーザー
PHP にアップグレードする際に、アプリの構成を変更する必要はありません。Users API の動作、機能、設定手順に変更はありません。詳しくは、Users API の概要と Users API リファレンス ガイドをご覧ください。
コミュニティ提供のライブラリ
PHP にアップグレードするときに、datastore
用にコミュニティ提供の API を使用できます。
その他の考慮事項
以前のバンドル サービスの機能を PHP アプリでテストする際に、ローカルの開発用サーバーを使用できます。
dev_appserver.py
コマンドを実行するときに、--php_executable_path
引数を PHP 実行可能ファイルに設定します。これは、php-cgi 実行可能ファイルを必要とする PHP 5 とは異なることに注意してください。プロジェクトに
composer.json
ファイルがある場合は、--php-composer-path
をcomposer.phar
ファイルのパスに設定します。アプリをデプロイするには、
gcloud app deploy
コマンドを使用します。PHP ランタイムのロギングは、Cloud Logging のロギング標準に従います。PHP ランタイムでは、アプリログがリクエストログにバンドルされなくなり、別のレコードに分離されます。ログの読み取りと書き込みの詳細については、ログの書き込みと表示のガイドをご覧ください。
例
以前のバンドル サービスを PHP で使用する方法の例については、コードサンプルをダウンロードしてください。