PHP - curl_exec需要100毫秒

时间:2012-02-29 19:26:25

标签: php curl

我的PHP项目通过使用curl从WCF REStful Web服务获取数据来工作。

但是,由于某种原因,即使WCF Web服务位于同一台机器上,curl_exec函数也总是需要大约100ms才能返回,并且调用的WCF服务函数只需要3ms来执行。

我已经分析了WCF服务,整个WCF堆栈接受HTTP请求,并在10ms内返回结果XML(一个包含5个元素的微小XML结构)。

以下是我的cURL设置代码:

    $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 );

在这段代码之后立即调用curl_exec,这是我在100ms一致测量的curl_exec调用。

重要的是我把这个PHP站点的加载时间缩短了,我无法理解为什么会这样。

更新:

cURL的curl_exec似乎总是花费100毫秒而不管请求是什么,尽管非常有趣的是当我发出第二个curl_exec请求时(在相同的PHP页面执行中)它完成得更快 - 大约20ms。

神秘感加深了。

更新2:

我意识到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查找需要这么长时间,因为Windows(服务器操作系统)已经缓存了DNS信息,而其他应用程序(桌面,ASP.NET等)可以在1ms内解析名称,但cURL在125ms内完成。

cURL有什么特别之处,它无法使用操作系统的DNS缓存?

2 个答案:

答案 0 :(得分:0)

我认为这是我的PHP安装中包含的cURL版本中的一个错误。在我将cURL(和PHP)更新到更新版本后,问题消失了,curl_exec现在在20ms内执行。

答案 1 :(得分:0)

确保您要连接的域位于服务器主机文件中。如果curl没有在调用之间缓存结果,那么100ms可能是DNS查找时间。