PHP cURL:在进行大量REST调用时提高性能

时间:2012-09-27 09:12:42

标签: php rest curl

我有一个可以调用外部休息服务的功能。通常取决于输入数据,例如。用户请求的内容,但想法是批量转换特殊类型的数据和标识符。即使只有50次转换,这种情况也非常缓慢。

使用php_curl调用REST Web服务。现在我认为为每个单一转换创建一个新连接会导致这种情况。我尝试重新设置相同的句柄并调整每次调用的URL,我也试过了:

http://technosophos.com/content/connection-sharing-curl-php-how-re-use-http-connections-knock-70-rest-network-time

在这两种情况下,我的性能提升了0。我在Windows上。也许这就是问题?使用TCPView工具,我可以很容易地看到“连接”是“整体”创建的。也许我解释错了,但对我而言,它似乎仍在为每次转换创建一个连接。

所以我有点失落。任何人都知道在Windows实现上是否实际重用了连接?它可以由远程服务器引起吗?

编辑:

目前的设置很简单:

if(empty($this->curlHandle)){
    $this->curlHandle = curl_init();
    curl_setopt($this->curlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($this->curlHandle, CURLOPT_PROXY, $this->proxy);
    curl_setopt($this->curlHandle, CURLOPT_PROXYPORT, $this->proxyPort);
    curl_setopt($this->curlHandle, CURLOPT_HTTP_VERSION, 1.1);
}        
//$ch = curl_init();
curl_setopt($this->curlHandle, CURLOPT_URL, $baseUrl . $identifier . '/' . $format);


$result = curl_exec($this->curlHandle);

这里是一个示例调用返回的标题:

HTTP/1.1 200 OK
Date: Fri, 28 Sep 2012 05:23:37 GMT
Server: Apache/2.2.15 (Scientific Linux)
Last-Modified: Fri, 28 Sep 2012 05:16:37 GMT
ETag: "0924166dd08dd5845929794dbd07d288"
Expires: Mon, 08 Oct 2012 05:16:37 GMT
Cache-Control: max-age=864000
Access-Control-Allow-Origin: *
Connection: close
Content-Type: text/plain; charset=UTF-8

编辑2:

有一种不同的远程Web服务提供类似的功能(但数据较少,例如ID的查找数据)。在Firefox中运行时,服务会发送一个keep alive标头。所以我实现了它。但问题仍然存在。同样慢。然后我使用curl cmd-line来玩,并注意到当使用curl时,服务器返回一个连接:close。

2 个答案:

答案 0 :(得分:1)

由于各种原因,重新使用相同的CURL句柄确实无法正常工作。 curl_exec并非真正用于此用途。

curl_multi_exec 可以很好地处理这种情况。但它通常要求远程主机也保持连接。

然而,在任何这些策略发挥作用之前,客户端和服务器必须同意保持连接打开,这就是未发生的事情。

根据您在上面发布的标题,“Connection:close”从服务器返回。这意味着未启用Keep-alives。这可能是因为REST服务器(或您的代理服务器,如果有的话)不允许它们,这可能有一定道理。这也可能是因为您本地的CURL呼叫由于某种原因没有向远程服务器发送“Connection:Keep-Alive”。

尝试以下方法:

  • 检查CURL的出站标头,看它是否要求保持活动状态。
  • 尝试启用CURLOPT_VERBOSE,它将显示低级连接详细信息

那些至少应该让你走上正轨。但是,在一天结束时,如果远程服务器不支持同一连接上的多个请求,您将无法做任何事情来改变它。

答案 1 :(得分:0)

由于您正在批处理,您可以与curl_multi_exec

并行执行多个调用

http://php.net/manual/en/function.curl-multi-exec.php