HTTPリクエスト時のエラー

GAE/PHPのStandard環境から外部のWeb APIを叩こうとするとInternal Errorになって、ログをみると以下のようなエラーメッセージが記録されていたりする。

The Socket API will be enabled for this application once billing has been enabled in the admin console.

これはわかりづらいんだけど、

  1. HTTPリクエスト時にcurlを使おうとした
  2. curl利用時にはSocket APIを利用するらしい
  3. Socket APIを利用するには課金を有効にしないといけない

ということらしい。

回避方法

回避方法はいくつかあって、

  1. 課金を有効にする
  2. curlの機能縮小版のcurl_liteを利用する
  3. Streamを使う(urlfetch)

という3つが紹介されている。

自分はプライベートで遊んでいるだけなので、無料で利用出来るStreamを使うようにしている。

HTTPクライントにGAE/PHPの公式ドキュメントでも紹介されているGuzzleを利用する場合、

curlが使えない場合はデフォルトではStreamが使われるよ

みたいなことが書かれていたので、何も設定せずに使っていたし、それで使えていた。
しかし、ある日から突然上記エラーが・・・。
もしかしたらGuzzleの振る舞いが変わったのかもしれないので、以下のように明示的に指定してあげるようんした。

<?php

$client = new GuzzleHttp\Client(['verify' => false, 'stream' => true]);

ついでにverifyfalseにしとけば、ログにSSL証明書関連の警告が出るのも防げるので設定している。

おわりに

GAEのStandard環境は外部へのアクセスに対してのこれらの制約が面倒なので、既存のライブラリとかを有効利用したい場合は素直に課金を有効にしたほうが楽。
別にSocket APIを利用する度に課金されるわけじゃないし。