PHP curl / REST有时非常慢

时间:2017-07-19 08:57:21

标签: php curl

对于通常需要不到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代码,只是没有结果数据。

0 个答案:

没有答案
相关问题