[ 1.5 ] file_get_contentsとHTTP_request、どっち?
さてさて、Amazon Product Advertising APIに限らず、外部サーバへリクエスト送信→レスポンスを受け取る...というときに、PHPではfile_get_contentsという関数が使えます。
$url = 'http://〜';
$result = file_get_contents( $url );
// $urlのレスポンスを取得する。
?>
うん、シンプルでよろしい。でももう少し詳細な設定をしたいときがありますね。たとえば相手方のサーバが落ちていたりした場合の為に、タイムアウトの時間を設定したい時にはどうしたらいいのだろう。
このタイムアウトの時間はPHPの初期設定で決められています。default_socket_timeout の値。php.iniを開かずとも、ini_get関数を使って設定値を確かめることができます。
echo ini_get( 'default_socket_timeout' );
?>
ウチの場合は「60」と表示されました。単位は秒なので、レスポンスが戻ってこなくても1分間も待つらしい。これではちょっと長過ぎるので、設定を10秒くらいに変更してみます。
ini_set( 'default_socket_timeout' , 10 );
?>
これで、このスレッドが実行されている間だけタイムアウト時間が10秒に設定されます。file_get_contentsして10秒以内にレスポンスが戻ってこなければFALSEが返されるはず。
それからfile_get_contentsと同じく、http経由で外部サーバから情報を取得する手段としてHTTP_Requestがありますね。こちらはPEARのライブラリに属しているので、まずはインストールしないと使えません。インストールが済んでいるとして、例えばこんな感じで使います。オプション設定項目が豊富。
require_once( 'HTTP/Request.php' );
$url = <URL>;
$httpOption = array(
'timeout' => 10,
'allowRedirects' => true,
'maxRedirects' => 3,
'readTimeout'=>array(10,0)
);
$http = new HTTP_Request( $url , $httpOption );
$http->addHeader( 'User-Agent' , 'HTTP_Request' );
$response = $http->sendRequest();
if (!PEAR::isError($response)) {
$responseCode = $http->getResponseCode();// ResponseCode(200等)を取得
if( $responseCode == "200" ){
$result = $http->getResponseBody();
}else{
// 正常にレスポンスを得られなかったときの処理
}
}else{
// 正常にレスポンスを得られなかったときの処理
}
?>
実際はもうちょっと非正常なレスポンス(リターンコードが200以外の場合)のときの処理を考えたほうが良いと思います。
HTTP_Requestのソースコードを見てみると、パラメータtimeoutが 'Connection timeout in seconds'、readTimeoutが 'Timeout for reading / writing data over the socket (array (seconds, microseconds))' と説明されていますね。
...まぁWeb APIにリクエストを投げてレスポンスを受け取るだけならば、file_get_contentsで充分な気がします。
ちなみにHTTP_Request、requireするときに警告が出ます。この警告、PEARライブラリのソースが古いことが原因なので、一時的に警告メッセージの出力を抑制するという対処療法か、もしくは警告が出る箇所のソースコードを書き換える、という根本治療をしなくてはなりません。
まぁ警告が出るだけで(今のところは)正しく動くので、とりあえずこのメッセージを出力しないようにする方法。
参考 → PEARの呼び出しなどで出るStrict errorやWarningを一時的に消す方法
|Knowledge Database IT
うちではStrict Standards警告ではなくてDeprecated警告が出ていたので、結局こんな感じにしたら大丈夫。
$E = error_reporting();
if(($E & E_DEPRECATED) == E_DEPRECATED)
error_reporting($E ^ E_DEPRECATED);
require_once( 'HTTP/Request.php');
error_reporting($E);
?>
PEARではHTTP_Request2という新しいライブラリが作成途上だそうで。いっそ早めに乗り換えておくのも手かもしれません。
参考 → [php][pear]HTTP_Request2のサンプル#1|うえちょこ@ぼろぐ
コメント