PHP 7 / 8 用の以前のバンドル サービスにアクセスする

このページでは、App Engine スタンダード環境用の PHP 7 / 8 ランタイムにバンドル サービスをインストールして使用する方法について説明します。アプリは PHP 7 / 8 用 App Engine サービス SDK を使用して、バンドルされたサービスにアクセスできます。

始める前に

  1. PHP 7 / 8 ランタイムで呼び出すことができる以前のバンドル サービス API のリストをご覧ください。

  2. app.yaml ファイルを更新して次の行を追加します。

    app_engine_apis: true
    
  3. PHP 7 / 8 アプリをテストするには、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 つの方法があります。

  1. Packagist コマンドを実行して、composer.json ファイルに SDK を追加します。

    composer require google/appengine-php-sdk
    
  2. 次のように詳細を指定して composer.json ファイルを手動で作成します。

    PHP 7 / 8

    {
        "require": {
            "google/appengine-php-sdk": "^2.1" // Or any later version
        }
    }
    

PHP 7 / 8 では、App Engine API に明示的な依存関係を指定する必要があります。autoload.php を含める方法については、こちらのドキュメントをご覧ください。

ライブラリのインポート

use 演算子を使用して、使用可能な API のリストから必要なクラスをインポートします。たとえば、Google\AppEngine\Api\AppIdentity\ClassName は、次のステートメントを使用してインポートできます。

use Google\AppEngine\Api\AppIdentity\ClassName;

移行に関する考慮事項

App Identity

PHP 7 / 8 にアップグレードする際に、アプリの構成を変更する必要はありません。App Identity API の動作、機能、設定手順に変更はありません。詳細については、API Identity の概要App Identity API のリファレンス ガイドをご覧ください。

メール

PHP 7 / 8 Mail API は PHP 5 Mail API とほぼ同じですが、メールサービスを有効または無効にする方法が少し異なります。以降のセクションでは、それぞれのランタイムの違いについて説明します。

Message クラス

PHP 7 / 8 の Message クラスは、use インポートが更新されている点を除き、PHP 5.5 と同じように動作します。相違点は次のとおりです。

PHP 5.5

use google\appengine\api\mail\Message;

PHP 7 / 8

use Google\AppEngine\Api\Mail\Message;

インポート ステートメントを変更できない場合は、PHP 7 / 8 で元の PHP 5.5 インポート ステートメントを使用できます。

Mail 関数

PHP 5.5 では、ネイティブの PHP mail() 関数は、App Engine の Mail 関数によってオーバーロードされていました。

デフォルトでは、PHP 7 / 8 の 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 7 / 8 用 Memcache を使用するには、Memcache ライブラリの明示的な宣言を追加する必要があります。以前の PHP 5.5 用 Memcache では明示的な宣言が必要ありませんでした。この明示的な宣言により、ネイティブの PHP Memcache と App Engine Memcache を柔軟に切り替えることができます。

明示的な宣言を除き、PHP 7 / 8 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 7 / 8 用 Memcache API の例:

use Google\AppEngine\Api\Memcache\Memcache;

$memcache = new Memcache();
return $memcache->get($key);

PHP 7 / 8 用 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 7 / 8 で 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 7 / 8 にアップグレードする際に、アプリの構成を変更する必要はありません。Modules API の動作、機能、設定手順に変更はありません。詳細については、モジュールの概要Modules API リファレンス ガイドをご覧ください。

セッション

PHP 7 / 8 セッションは、PHP 5.5 セッションと同じように動作します。ただし、PHP 5.5 セッションはデフォルトで MemcacheSessionHandler クラスを使用するため、設定手順が異なります。

PHP 7 / 8 のセッションを使用するには、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 7 / 8 にアップグレードする際に、アプリの構成を変更する必要はありません。タスクキューの動作、機能、設定手順に変更はありません。詳細については、タスクキューの概要ガイドのセッション セクションと Task Queue API リファレンス ガイドをご覧ください。

URL 取得

PHP 7 / 8 用の URL 取得を使用するには、URL 取得ライブラリの明示的な宣言を追加する必要があります。以前の PHP 5 用 URL 取得サービスでは明示的な宣言が不要であり、暗黙的に使用されていました。

PHP 5 では、App Engine の URL 取得サービスが、PHP 5.5 でインターネット コンテンツを取得する唯一の方法であったため、インターネットにアクセスしたほとんどの PHP 5.5 関数には、自動的に UrlFetch を使用するパッチが適用されていました。

PHP 7 / 8 では、ネイティブの PHP ネットワークがインターネットにアクセスできるため、この自動パッチの適用は行われません。場合によっては、元の UrlFetch メカニズム、特に、使用している App Engine アプリにリクエストを行っている App Engine アプリを識別するために、X-Appengine-Inbound-Appid リクエスト ヘッダーを提供するメカニズムを使用できます。

PHP 7 / 8 で URL 取得を有効にするには、ストリーム ラッパーで明示的な宣言を使用するか、次のセクションで説明するように UrlFetch クラスを直接使用します。

オプション 1a. ストリーム ハンドラ

App Engine の URL 取得サービスを有効にして、http://https:// の両方の PHP ストリーム ハンドラに HTTP リクエストを行えます。方法:

  1. stream_wrapper_unregister() を使用して、HTTP(S) 用のネイティブ PHP ストリーム ハンドラの登録を解除します。
  2. stream_wrapper_register() を使用して、HTTP(S) を UrlFetchStream クラスに登録します。
  3. ストリーム ラッパーを使用する構成を使用して file_get_contents() を呼び出します。

比較のため、PHP 5 と PHP 7 / 8 が同等である例をご覧ください。

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) レスポンス ヘッダーを使用する手順は、ストリーム ハンドラの使用方法と似ています。

  1. stream_wrapper_unregister() を使用して、HTTP(S) 用のネイティブ PHP ストリーム ハンドラの登録を解除します。
  2. stream_wrapper_register() を使用して HTTP(S) を UrlFetchStream クラスに登録します。
  3. 必要な構成で file_get_contents() の代わりに fopen() を使用します。
  4. 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 7 / 8 にアップグレードする際に、アプリの構成を変更する必要はありません。Users API の動作、機能、設定手順に変更はありません。詳しくは、Users API の概要Users API リファレンス ガイドをご覧ください。

コミュニティ提供のライブラリ

PHP 7 / 8 にアップグレードするときに、datastore 用にコミュニティ提供の API を使用できます。

その他の考慮事項

  • 以前のバンドル サービスの機能を PHP 7 / 8 アプリでテストする際に、ローカルの開発用サーバーを使用できます。dev_appserver.py コマンドを実行するときに、--php_executable_path 引数を PHP 7 / 8 実行可能ファイルに設定します。これは、php-cgi 実行可能ファイルを必要とする PHP 5 とは異なることに注意してください。

    プロジェクトに composer.json ファイルがある場合は、--php-composer-pathcomposer.phar ファイルのパスに設定します。

  • アプリをデプロイするには、gcloud app deploy コマンドを使用します。

  • PHP 7 / 8 ランタイムのロギングは、Cloud Logging のロギング標準に従います。PHP 7 / 8 ランタイムでは、アプリログがリクエストログにバンドルされなくなり、別のレコードに分離されます。ログの読み取りと書き込みの詳細については、ログの書き込みと表示のガイドをご覧ください。

以前のバンドル サービスを PHP で使用する方法の例については、コードサンプルをダウンロードしてください。