0

我有一个经常调用外部休息服务的功能。多久取决于输入数据,例如。用户要求什么,但想法是批量转换一种特殊的数据和标识符。即使只有 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 工具,我可以很容易地看到新连接是“集体”创建的。也许我解释错了,但对我来说,每次转换似乎仍在创建 1 个连接。

所以我有点迷路了。任何人都知道连接是否真的在 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 中运行时,该服务会返回一个保持活动的标头。所以我实现了它。但问题仍然存在。一样慢。然后我使用 curl cmd-line 玩了一下,发现使用 curl 时说服务器返回一个连接:关闭。

4

2 回答 2

1

由于各种原因,重新使用相同的 CURL 句柄实际上并不能很好地工作。curl_exec并不是真的打算用于这种用途。

curl_multi_exec 确实很好地处理了这种情况。但它通常需要远程主机也保持连接。

然而,在这些策略中的任何一个起作用之前,客户端和服务器必须同意保持连接打开,而这并没有发生。

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

尝试以下操作:

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

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

于 2012-10-26T18:53:11.580 回答
0

由于您正在批处理,因此您可以与 curl_multi_exec 并行执行多个调用

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

于 2012-09-28T05:28:05.850 回答