我的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缓存?
答案 0 :(得分:0)
我认为这是我的PHP安装中包含的cURL版本中的一个错误。在我将cURL(和PHP)更新到更新版本后,问题消失了,curl_exec现在在20ms内执行。
答案 1 :(得分:0)
确保您要连接的域位于服务器主机文件中。如果curl没有在调用之间缓存结果,那么100ms可能是DNS查找时间。