【问题标题】:CURL with PHP - Very slow使用 PHP 的 CURL - 非常慢
【发布时间】:2010-12-30 21:56:50
【问题描述】:

全部,

我必须请求一个返回 JSON 请求的 URL。我正在使用 PHP 和 CURL 来执行此操作。目前,请求和响应大约需要 3-4 秒。

以下是卷曲代码

    $ch = curl_init();
    $devnull = fopen('/tmp/curlcookie.txt', 'w');

    curl_setopt($ch, CURLOPT_STDERR, $devnull);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_URL, $desturl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

    $ret = curl_exec($ch);

    curl_close($ch);

    if ($devnull)
    {
        fclose($devnull);
    }

下面是 CURL_GETINFO 数组

Array
(
    [url] => https://xx.xx.xxx.xx/portalsite/tester
    [content_type] => application/json
    [http_code] => 200
    [header_size] => 198
    [request_size] => 835
    [filetime] => -1
    [ssl_verify_result] => 20
    [redirect_count] => 0
    [total_time] => 2.054561
    [namelookup_time] => 6.5E-5
    [connect_time] => 0.016048
    [pretransfer_time] => 0.123947
    [size_upload] => 699
    [size_download] => 46735
    [speed_download] => 22746
    [speed_upload] => 340
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 1.743973
    [redirect_time] => 0
)

如何加快 CURL 处理时间?

谢谢

【问题讨论】:

  • 用浏览器访问$desturl需要多长时间?如果这也需要 3-4 秒,我不认为 cURL 是罪魁祸首。
  • 如果我显式访问 URL,它实际上非常快。不到 2 秒
  • 我还发现设置 CURLOPT_TIMEOUT 会强制 cURL 使用该时间,最好不要设置此常量并让 cURL 卷曲

标签: php curl libcurl


【解决方案1】:

根据this answer(类似问题)如果您在 Mac OS X 上并且使用 xxxx.local 访问您的项目(127.0.0.1 myproject.local在您的 /etc/hosts/ 中),cURL 可能会很慢

正如@lepix 所说:

这是因为 .local tld 是为 Bonjour 服务保留的,而这 自 Mac OS X Lion (10.7) 起。

希望它会有所帮助,感谢 lepix。

【讨论】:

    【解决方案2】:

    我遇到了这样的问题,使用 wget 速度很快(最多 1 秒),使用 cURL 大约需要 5 秒才能获取页面,当 tcpdump-ing 时我发现 cURL 尝试进行反向 DNS 查找,如果服务器没有注册反向 DNS,它会减慢你的速度,我在我的本地 DNS 服务器上设置了一个反向 DNS,所以现在使用 cURL 对该站点的每个请求都非常快。我没有找到从 cURL 设置禁用反向 DNS 查找的方法。

    我的建议是扫描您的流量,看看它在哪里等待了这么久。

    【讨论】:

      【解决方案3】:

      看起来大部分时间都在等待服务器响应(starttransfer_time - pretransfer_time = 1.620026)......也许服务器正在执行一些数据库或其他需要时间的操作?

      【讨论】:

      • 有什么办法可以减少namelookup_time?
      • 使用ip代替名称。
      • 您可以将其添加到 /etc/hosts 或指定 IP 地址(带有 Host: 标头)
      • 我正在使用IP。还是一样。 :( 想知道它是否需要在 /etc/resolv.conf 中?
      • 我猜主机名被缓存了(查找需要 65 微秒)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多