PHP バージョン 5.5 はコミュニティでサポートを終了したため、新しいアプリでは PHP 7 ランタイムを使用することを強くおすすめします。

HTTP(S) リクエストの発行

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。既存のアプリでは省略可能ですが、まもなく、新しいアプリのすべてにおいて App Engine の URL に REGION_ID.r を含めることが必須となる予定です。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL の更新や他の変更を行う必要はありません。

詳しくは、リージョン ID をご覧ください。

このページでは、App Engine アプリから HTTP(S) リクエストを発行する方法について説明します。

App Engine は、URL 取得サービスを使用して、送信 HTTP(S) リクエストを発行します。 リクエスト サイズの上限と URL 取得リクエストで送信されるヘッダーの詳細については、送信リクエストをご覧ください。

HTTP リクエストの発行

PHP 言語には、リモートから HTTP リクエストを行う関数がいくつか用意されています。 これらは Google App Engine でさまざまな方法で実装され、割り当てや料金も異なります。

  • ストリーム ハンドラ: http://https:// に対するネイティブの PHP ストリーム ハンドラは、App Engine の URL 取得サービスを使用して HTTP リクエストを送信するように構成されています。file_get_contents() などの PHP 関数の多くは、ストリーム ハンドラを間接的に使用して URL 取得サービスを利用します。
  • cURL 拡張機能: cURL 拡張機能ではソケット サービスを使用します。アプリケーションの php.ini ファイルで cURL 拡張機能を有効にし、プロジェクトで課金を有効にする必要があります。
  • cURL "lite": cURL "lite" は Google が提供する cURL ライブラリで、ソケット サービスではなく URL 取得サービスを使用します。アプリケーションの php.ini ファイルで cURL "lite" を有効にする必要があります。cURL 拡張機能の次のメソッドは使用できません。
    • curl_multi_* 個の関数
    • 非標準プロトコルのサポート
    • 80(HTTP)と 443(HTTPS)以外のポートのサポート

cURL、cURL Lite、ストリーム ラッパーのどれを使用するかは、アプリケーションと環境設定によって異なります。わからない場合は、Guzzle HTTP ライブラリを使用してください。Guzzle は、HTTP リクエストの抽象レイヤーを提供します。これにより、アプリケーション コードを書き換えることなく、基礎となるサービスを変更できます。

ストリーム ハンドラ

標準の HTTP(S) ストリーム ハンドラは、fopen()file_get_contents() などの PHP 組み込み関数で使用されます。

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = "accept: */*\r\n" .
    "Content-Type: application/x-www-form-urlencoded\r\n" .
    "Custom-Header: custom-value\r\n" .
    "Custom-Header-Two: custom-value-2\r\n";

$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);
$result = file_get_contents($url, false, $context);

cURL と cURL "lite"

cURL 関数を送信リクエストに使用するには、php.ini で cURL または cURL "lite" を有効にします。cURL "lite" では URL 取得サービスが使用され、cURL では Sockets API が使用されます。

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept: */*',
    'Content-Type: application/x-www-form-urlencoded',
    'Custom-Header: custom-value',
    'Custom-Header-Two: custom-value-2'
];

// open connection
$ch = curl_init();

// set curl options
$options = [
    CURLOPT_URL => $url,
    CURLOPT_POST => count($data),
    CURLOPT_POSTFIELDS => http_build_query($data),
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
];
curl_setopt_array($ch, $options);

// execute
$result = curl_exec($ch);

// close connection
curl_close($ch);

Guzzle

Guzzle はデフォルトで PHP ストリーム ハンドラを使用しますが、cURL または cURL "lite" が有効になっている場合は cURL ハンドラを自動的に使用します。

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept' => '*/*',
    'Content-Type' => 'application/x-www-form-urlencoded',
    'Custom-Header' => 'custom-value',
    'Custom-Header-Two' => 'custom-value',
];

$guzzle = new GuzzleHttp\Client;
$request = new GuzzleHttp\Psr7\Request('POST', $url, $headers, http_build_query($data));
$result = $guzzle->send($request);

リクエストのタイムアウトの設定

期限を変更するには、HTTP コンテキストtimeout オプションを使用します。

HTTPS リクエストの発行

前述の HTTP リクエストの発行をご覧ください。

ホスト証明書の検証を無効にする

デフォルトでは、App Engine に実装された HTTPS ラッパーがホストの証明書を検証し、証明書が一致しない場合はリクエストを拒否します。この動作を無効にするには、SSL/TLS コンテキスト オプションverify_peer の値を false に設定します。

別の App Engine アプリへのリクエストの発行

別の App Engine アプリにリクエストを発行する場合、App Engine アプリでリクエストに X-Appengine-Inbound-Appid ヘッダーを追加して、その ID を表明する必要があります。URL 取得サービスにリダイレクトを実行しないよう指示する場合、App Engine はこのヘッダーをリクエストに自動的に追加します。

URL 取得サービスがリダイレクトに従わないように指示するには、HTTP コンテキスト オプションfollow_location パラメータを false に設定する必要があります。

次のステップ

送信リクエスト内の URL 取得リクエストで送信されるヘッダーなど、URL 取得サービスについて学習する。