Amazon Webサービスを使ってみる。その1.5。

[ 1.5 ] file_get_contentsとHTTP_request、どっち?

さてさて、Amazon Product Advertising APIに限らず、外部サーバへリクエスト送信→レスポンスを受け取る...というときに、PHPではfile_get_contentsという関数が使えます。

<?php
  $url = 'http://〜';
  $result = file_get_contents( $url );
                 // $urlのレスポンスを取得する。
?>

うん、シンプルでよろしい。でももう少し詳細な設定をしたいときがありますね。たとえば相手方のサーバが落ちていたりした場合の為に、タイムアウトの時間を設定したい時にはどうしたらいいのだろう。

このタイムアウトの時間はPHPの初期設定で決められています。default_socket_timeout の値。php.iniを開かずとも、ini_get関数を使って設定値を確かめることができます。

<?php
  echo ini_get( 'default_socket_timeout' );
?>

ウチの場合は「60」と表示されました。単位は秒なので、レスポンスが戻ってこなくても1分間も待つらしい。これではちょっと長過ぎるので、設定を10秒くらいに変更してみます。

<?php
  ini_set( 'default_socket_timeout' , 10 );
?>

これで、このスレッドが実行されている間だけタイムアウト時間が10秒に設定されます。file_get_contentsして10秒以内にレスポンスが戻ってこなければFALSEが返されるはず。

それからfile_get_contentsと同じく、http経由で外部サーバから情報を取得する手段としてHTTP_Requestがありますね。こちらはPEARのライブラリに属しているので、まずはインストールしないと使えません。インストールが済んでいるとして、例えばこんな感じで使います。オプション設定項目が豊富。

<?php
  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警告が出ていたので、結局こんな感じにしたら大丈夫。

<?php
    $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|うえちょこ@ぼろぐ

 

カテゴリ: