私のPHPプロジェクトは、WCFのデータを取得して動作します。PHP - curl_exec taking 100ms
しかし、何らかの理由でcurl_exec関数は、WCF Webサービスが同じマシン上にあり、呼び出されるWCFサービス関数が実行するのに3ミリ秒かかりますが、常に返るのに約100ミリ秒かかります。
私はWCFサービスをプロファイリングしました.WCFスタック全体がHTTP要求を受け入れ、結果のXML(5要素の小さなXML構造)を10ms未満で返します。
以下は私のcURLのセットアップコードです:curl_execする
$curl = curl_init($this->uri);
curl_setopt($curl, CURLOPT_HEADER , true); // return response HTTP headers in output
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // return result instead of echoing
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop cURL from verifying the peer's certificate. This is set because by default (and right now) cURL does not trust /any/ certificate.
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // follow redirects, Location: headers (but does it really?)
curl_setopt($curl, CURLOPT_MAXREDIRS , 10 ); // but dont redirect more than 10 times
curl_setopt($curl, CURLOPT_CUSTOMREQUEST , $this->method);
if(isset($this->username ))
curl_setopt($curl, CURLOPT_USERPWD , $this->username . ':' . $this->password);
if(isset($this->userAgent))
curl_setopt($curl, CURLOPT_USERAGENT, $this->userAgent);
if(isset($this->content)) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $this->content);
array_push($this->headers, 'Content-Length: '. $this->contentLength);
if(isset($this->contentType))
array_push($this->headers, 'Content-Type: ' . $this->contentType);
}
if(isset($this->contentFile)) {
curl_setopt($curl, CURLOPT_INFILE , $this->contentFile );
curl_setopt($curl, CURLOPT_INFILESIZE, $this->contentLength);
array_push($this->headers, 'Content-Length: '. $this->contentLength);
array_push($this->headers, 'Content-Type: ' . $this->contentType);
}
if(count($this->headers) > 0)
curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers);
呼び出しはこのコードブロックの直後に発生し、それは私が一貫して100ミリ秒で測定curl_exec呼び出します。
このPHPサイトの読み込み時間が短くて、なぜこのようなことが起こるのか理解できません。
UPDATE:
のcURLのcurl_execは、いつも私が(同じPHPページの実行中)は、第2のcurl_exec要求を行うときに、非常に興味深いのが、関係なく、要求されているのは100msを取るように見える、それはより速く多くを完了 - の周りには20ms 。
謎が深まる。
UPDATE 2:
I(すなわちcurl_getinfoを実現する)タイミング情報を含む連想配列を返します。私が最初にcURLの要求から情報をダンプするとき、私は以下を参照してください。
'total_time' => 0.125,
'namelookup_time' => 0.125,
'connect_time' => 0.125,
'pretransfer_time' => 0.125,
'starttransfer_time' => 0.125,
以降のすべての要求は、この(またはそれ以上)のようなものに対し:
'total_time' => 0.016,
'namelookup_time' => 0,
'connect_time' => 0,
'pretransfer_time' => 0,
'starttransfer_time' => 0.016,
遅延がnamelookupであるようだが、私は、DNSの情報がキャッシュされており、他のアプリケーション(デスクトップ、ASP.NETなど)が1ms未満で名前を解決できるのに、Windowsの(サーバーOS)がすでにDNSルックアップに長時間かかる理由はわかりませんが、cURLは125ms。
cURLについて特別な点は、OSのDNSキャッシュを使用できないことですか?
オーバーヘッド、接続、TCP、HTTPプロトコルなどサービスがローカルの場合にHTTPリクエストを使用する理由は何ですか?それを行うもう一つのより速い方法はありませんか?あなたのWCFサービスのプロファイリングはおそらく、厄介な接続とHTTPビジネスがしばらく続いていることから始まるでしょう... – Wrikken
Ditto on wrikkenさんのコメント。タイミング計算でTCP/HTTPのオーバーヘッド全体を無視しました。つまり、完全にサービスされていないページにカールするタイミングはどうですか?あなたのWCFレスポンスの1つと同じサイズのシンプルな静的なhtmlページで、カールにかかる時間を確認できます。それが100msでもあれば、それはwcfではなく、より多くのカール/オーバーヘッドがあります。 –
同じマシン上にある場合は、他のシステムのデータベースから直接読み取るのはどうですか? –