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

PHP cURL:在执行大量REST调用时提高性能,php,rest,curl,Php,Rest,Curl,我有一个经常调用外部rest服务的函数。频率取决于输入数据,例如用户请求的内容,但其思想是批量转换特殊类型的数据和标识符。这是非常缓慢的,即使只有50次转换 RESTWeb服务是用php_curl调用的。现在我认为,为每一次转换创建一个新的连接是造成这种情况的原因。我尝试重新设计相同的句柄,并为每个调用调整url,我还尝试了以下方法: 在这两种情况下,我的性能都提高了0。我在窗户上。也许这就是问题所在?使用TCPView工具,我可以很容易地看到新的连接是“整体”创建的。也许我的解释是错误的,但

我有一个经常调用外部rest服务的函数。频率取决于输入数据,例如用户请求的内容,但其思想是批量转换特殊类型的数据和标识符。这是非常缓慢的,即使只有50次转换

RESTWeb服务是用php_curl调用的。现在我认为,为每一次转换创建一个新的连接是造成这种情况的原因。我尝试重新设计相同的句柄,并为每个调用调整url,我还尝试了以下方法:

在这两种情况下,我的性能都提高了0。我在窗户上。也许这就是问题所在?使用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。

因为您正在批处理,所以可以与curl\u multi\u exec并行执行多个调用


由于各种原因,重复使用同一个卷曲手柄确实不能很好地工作
curl\u exec
并不是专门用于这种用途的

curl\u multi\u exec
可以很好地处理这种情况。但它通常要求远程主机也保持连接的活动状态

然而,在这些策略起作用之前,客户机和服务器必须同意保持连接打开,而这是不可能的

根据您上面发布的标题,“Connection:close”从服务器返回。这意味着未启用“保持生命”。这可能是因为REST服务器(或者您的代理服务器,如果有的话)不允许它们,这可能有一定的道理。这也可能是因为您的本地CURL调用出于某种原因没有向远程服务器发送“连接:保持活动”

请尝试以下操作:

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

这些至少会让你走上正轨。但是,到最后,如果远程服务器不支持同一连接上的多个请求,您将无法对其进行任何更改。

持久连接不是http 1.1的一部分,也不是http 1.0的一部分吗?您可能需要检查是否实际使用了1.1,是否请求了持久性,以及服务器是否支持持久性。在有了使用FF和firebug调用服务的绝妙(显而易见)想法之后,我看到服务器返回了一个连接:close header。我尝试发送一个连接:keep alive标头,但没有效果。如何查看使用的是哪个http版本?有两个相关的cURL选项:CURLOPT_MAXCONNECTS和CURLOPT_http_version,请查看文档。持久连接是http 1.1中的默认连接,curl确实支持AFAIK。这是什么类型的服务器?发布当前的设置可能是有意义的,即实现基于cURL的客户端的行。这会使“应用程序”设计过于复杂。这是一个用户上传一个文件,并得到一个文件转换回来。为了简单起见,输入是逐行读取的,输出是逐行写入的,因此需要同步curl调用。但看起来我不得不接受这个。没有考虑过委托书,事实上其中有一个。更有趣的是,代理的行为因用户代理而异(还涉及身份验证…)。所以在浏览器中一切都很好,连接保持活动状态,但不会从curl开始。所以我想我做什么并不重要,问题是解决不了的。