对于通常需要不到4秒的通话,最糟糕的例子是23分钟,对于通常需要不到1秒的通话,最差的例子是7分钟。我之前从未遇到过这个问题。它只发生在5%或更少的时间,并且更有可能在当天的第一次通话中发生。
花了8分钟的电话示例:
(
[url] => https://xxxxxxx/webservice/xxxx?offset=0&limit=1&xxxxx=xxxx
[content_type] => application/xml; charset=utf-8
[http_code] => 200
[header_size] => 501
[request_size] => 213
[filetime] => -1
[ssl_verify_result] => 10
[redirect_count] => 0
[total_time] => 529.413661
[namelookup_time] => 0.441115
[connect_time] => 0.464504
[pretransfer_time] => 0.546094
[size_upload] => 0
[size_download] => 14867
[speed_download] => 28
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => 0
[starttransfer_time] => 0.625664
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => xxx.xxx.xxx.xxx
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => xxx.xxx.xxx.xxx
[local_port] => 63322
)
正如你所看到的那样" total_time"非常高。
REST服务的代表说,他们的客户都没有报告任何类似的分期或生产。 (我将他们的登台服务器与localhost / XAMPP一起使用)他们也看不到他们的长时间。
我使用的功能:
public function loadObjFromPath($path, $params = []) {
$time_start = microtime(true);
$credentials = "TEST:$this->key";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->baseUrl.$path.'?'.http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERPWD, $credentials);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
$xml_obj = simplexml_load_string($result);
$time_end = microtime(true);
error_log('Secs: '.($time_end - $time_start).' '.print_r($info, true));
return $xml_obj;
}
如果我无法弄清楚为什么会发生这种情况,我以为我会将超时设置为60秒或更短,然后让它再次运行卷曲请求。目前它最终正常工作(200代码),即使它需要23分钟。它已经发生了大约6天 - 因为我已经开始使用它了。
我第一次在另一个互联网连接上使用它需要31秒,然后花了不到2秒。当需要很长时间我在其他窗口运行卷曲时,它们会同时快速完成。
以下代码似乎有效:
public function loadObjFromPath($path, $params = [], $timeout = 60) {
....if ($timeout) {
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
}
curl_setopt($ch, CURLOPT_USERPWD, $credentials);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
$time_end = microtime(true);
$secs = $time_end - $time_start;
if ($timeout && empty($result) && $secs > $timeout) {
error_log("Timeout: $timeout secs: $secs ".print_r($info,true));
return $this->loadObjFromPath($path, $params, 0);
}
CURLOPT_CONNECTTIMEOUT似乎没有停止执行长调用。当我使用CURLOPT_TIMEOUT并且返回时间比这要长时,它仍然返回200代码,只是没有结果数据。