4

サーバーを PHP 5.3.x から PHP 5.5.3 にアップグレードして以来、PHP Web サービス クライアントで問題が発生しています。

cURL がリクエストを実行するのにかかる時間を計るこの関数があります。

function makeRequest($method, $uri) {
    global $requests;

    addTime("makeRequest");

    $curl = curl_init($uri);

    curl_setopt($curl, CURLOPT_HEADER    , true ); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt($curl, CURLOPT_MAXREDIRS     , 10   );

    curl_setopt($curl, CURLOPT_CUSTOMREQUEST , $method);

    //////////////////////////////

    addTime("curl_exec");
    $responseContent = curl_exec($curl);
    remTime("curl_exec");

    addTime("curl_getInfo");
    $responseInfo = curl_getinfo($curl);
    remTime("curl_getInfo");

    array_push( $requests, var_export( $responseInfo, true ) );

    remTime("makeRequest");
}

addTimeメソッドの実行を正確に測定するためにremTimeログを記録する関数です。microtime(true)によって報告されたさまざまな時間も記録していますcurl_getinfo)。下記参照。

さまざまな URI で試してみました。これらは私の結果です:

https://api1.mywebservice.com/methodCall

  • 合計時間 - 0.406
  • namelookup_time - 0.0406
  • 接続時間 - 0.406
  • pretransfer_time - 0.406
  • starttransfer_time - 0.406
  • リダイレクト時間 - 0

makeRequest時間: 0.402

https://api2.mywebservice.com/methodCall

api2.mywebservice.com はマシンの%windir%\system32\drivers\etc\hostsファイルにハードコードされている127.0.0.1ため、このために DNS サーバーにヒットすることはありません。

  • 合計時間 - 0.406
  • namelookup_time - 0.0406
  • 接続時間- 0.0406
  • pretransfer_time - 0.0406
  • starttransfer_time - 0.0406
  • リダイレクト時間 - 0

makeRequest時間: 0.402

https://localhost/methodCall

  • 合計時間 - 0.406
  • namelookup_time - 0.406
  • 接続時間 - 0.406
  • pretransfer_time - 0.406
  • starttransfer_time - 0.406
  • リダイレクト時間 - 0

makeRequest時間: 0.403

https://127.0.01/methodCall

  • 合計時間 - 0
  • namelookup_time - 0
  • 接続時間 - 0
  • pretransfer_time - 0
  • starttransfer_time - 0
  • リダイレクト時間 - 0

makeRequest時間: 0.006

サーバーの DNS サーバーは約 5 ミリ秒しか離れていませんが、とにかく名前をキャッシュする必要があります。同じ時間を取得するという事実api2.mywebservice.comは、DNS サーバーのタイムアウトの問題ではなく、cURL 内で何かが腐っていることを示しています。

私も試しCURLOPT_RESOLVEましたが、効果がありませんでした:

curl_setopt( $c, CURLOPT_RESOLVE, array("api1.mywebservice.com:443:127.0.01") );

PHP の最新の (そして確かに最高の) エディションの cURL が結果を取得するのに非常に時間がかかるのはなぜですか?

4

1 に答える 1