2012-02-29 27 views
0

私の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キャッシュを使用できないことですか?

+1

オーバーヘッド、接続、TCP、HTTPプロトコルなどサービスがローカルの場合にHTTPリクエストを使用する理由は何ですか?それを行うもう一つのより速い方法はありませんか?あなたのWCFサービスのプロファイリングはおそらく、厄介な接続とHTTPビジネスがしばらく続いていることから始まるでしょう... – Wrikken

+0

Ditto on wrikkenさんのコメント。タイミング計算でTCP/HTTPのオーバーヘッド全体を無視しました。つまり、完全にサービスされていないページにカールするタイミングはどうですか?あなたのWCFレスポンスの1つと同じサイズのシンプルな静的なhtmlページで、カールにかかる時間を確認できます。それが100msでもあれば、それはwcfではなく、より多くのカール/オーバーヘッドがあります。 –

+0

同じマシン上にある場合は、他のシステムのデータベースから直接読み取るのはどうですか? –

答えて

0

私のPHPインストールに含まれるcURLのバグだと思います。 cURL(とPHP)を最新のバージョンに更新した後、問題は消え、curl_execは20ms未満で実行されます。

+0

あなたが以前に持っていたバージョンを教えてください。 – rudi

0

接続先のドメインがサーバーホストファイルにあることを確認してください。 curlが呼び出し間で結果をキャッシュしていなかった場合、100msはDNSルックアップ時間になります。

関連する問題