サーバーを 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 が結果を取得するのに非常に時間がかかるのはなぜですか?