【问题标题】:cURL is very slow on PHP 7 but not PHP 5cURL 在 PHP 7 上非常慢,但在 PHP 5 上不是
【发布时间】:2018-06-07 19:45:32
【问题描述】:

对于我来说,使用 PHP7.0.11 的 cURL 似乎比仅从命令行运行请求或在 PHP5.6.24 中运行时慢得多。我正在使用以下代码对其进行测试:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://i.imgur.com/H1zC601.gif");
curl_setopt($curl, CURLOPT_HTTPGET, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($curl);
var_dump(curl_getinfo($curl));

在 PHP5 和 PHP7 的 CLI 解释器中,在 PHP5 中我得到了

array(26) {
  ["url"]=>
  string(31) "https://i.imgur.com/H1zC601.gif"
  ["content_type"]=>
  string(9) "image/gif"
  ["http_code"]=>
  int(200)
  ["header_size"]=>
  int(597)
  ["request_size"]=>
  int(204)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(1.260002)
  ["namelookup_time"]=>
  float(0.060424)
  ["connect_time"]=>
  float(0.068474)
  ["pretransfer_time"]=>
  float(0.089705)
  ["size_upload"]=>
  float(0)
  ["size_download"]=>
  float(34327108)
  ["speed_download"]=>
  float(27243693)
  ["speed_upload"]=>
  float(0)
  ["download_content_length"]=>
  float(34327108)
  ["upload_content_length"]=>
  float(-1)
  ["starttransfer_time"]=>
  float(0.098354)
  ["redirect_time"]=>
  float(0)
  ["redirect_url"]=>
  string(0) ""
  ["primary_ip"]=>
  string(15) "151.101.124.193"
  ["certinfo"]=>
  array(0) {
  }
  ["primary_port"]=>
  int(443)
  ["local_ip"]=>
  string(14) "my IP"
  ["local_port"]=>
  int(44555)
}

在运行 PHP7 时,我得到了

array(26) {
  ["url"]=>
  string(31) "https://i.imgur.com/H1zC601.gif"
  ["content_type"]=>
  string(9) "image/gif"
  ["http_code"]=>
  int(200)
  ["header_size"]=>
  int(609)
  ["request_size"]=>
  int(61)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(16.875167)
  ["namelookup_time"]=>
  float(0.252648)
  ["connect_time"]=>
  float(0.260626)
  ["pretransfer_time"]=>
  float(0.280489)
  ["size_upload"]=>
  float(0)
  ["size_download"]=>
  float(34327108)
  ["speed_download"]=>
  float(2034178)
  ["speed_upload"]=>
  float(0)
  ["download_content_length"]=>
  float(34327108)
  ["upload_content_length"]=>
  float(-1)
  ["starttransfer_time"]=>
  float(0.288715)
  ["redirect_time"]=>
  float(0)
  ["redirect_url"]=>
  string(0) ""
  ["primary_ip"]=>
  string(15) "151.101.124.193"
  ["certinfo"]=>
  array(0) {
  }
  ["primary_port"]=>
  int(443)
  ["local_ip"]=>
  string(14) "my IP"
  ["local_port"]=>
  int(55559)
}

重要的部分是 total_time,在 PHP 5 中为 1.3 秒,但在 PHP 7 中为 16.9 秒。

当请求设置超时时,接收到的字节数与超时成正比 - 数据传输非常缓慢,而不是有一些障碍物在一段时间内阻止任何东西传输,然后整个东西都被一次性转移了。

服务器正在运行 Debian,我似乎无法在我的 Fedora 本地机器上重现该问题。

【问题讨论】:

  • 这是在同一台服务器上吗?
  • @ceejayoz 是的,所有测试(PHP7、PHP5 和命令行 curl(我没有确切的数字,但与 PHP5 的速度大致相同))都是在同一台服务器上执行的.
  • 你是在虚拟机上运行这个吗?
  • @Sherif 不,它是一个拥有大量资源的专用服务器。我可以在每次运行它们时重现结果。

标签: php curl


【解决方案1】:

Debian Stretch 上的 PHP 7 存在同样的问题。我注意到高 sys-cpu 时间:0.07s 用户 10.02s 系统 92% cpu 10.859 总计

禁用 transparent_hugepage 后问题已解决:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

它不会直接影响 curl 下载,但会减慢 php 内存分配。见:https://serverfault.com/questions/780555/how-to-troubleshoot-high-load-caused-by-php7

【讨论】:

    【解决方案2】:

    在我看来,这只是网络延迟问题或带宽问题。如果您检查两者之间的speed_download,您会发现其中一个的下载速度明显快于另一个。使用 PHP 5/7-CLI 的第一个结果显示"speed_download" => float(27243693),而第二个结果显示"speed_download" => float(2034178),而它们都具有相同的内容长度"download_content_length" => float(34327108)

    因此,第一个以约 25.9MB/秒的速度下载约 32.7MB 的文件,而第二个以约 1.9MB/秒的速度下载相同的文件。显然第二个需要更长的时间。

    【讨论】:

    • 但是两者都在同一台服务器上运行,我可以可靠地重现结果,所以这不仅仅是一些随机峰值。
    • 我相信你,但没有证据表明 PHP 在这方面有问题。您可能在某处有一些网络配置,如果它是基于软件的,它会按端口甚至按进程限制入站带宽。目前还不清楚是什么导致了问题,但数据指向带宽问题,而不是 PHP 问题。
    • 换一种说法,如果传输速度很慢,PHP 的完成速度无论如何都不能超过完成传输所需的速度。但是,如果不进一步调查该系统上的网络配置,为什么一个版本的 PHP 下载文件比另一个版本的 PHP 慢的问题仍然完全未知。我可以告诉你,我只是在本地在 PHP 5 和 PHP 7 上运行了你的代码,并且在以相同速度下载时得到了一致的结果。所以没有迹象表明它是 PHP 的。必须是特定于您的设置。
    • 我知道下载速度很慢,但我想弄清楚为什么会这样。你可能是对的,这是一个配置问题,但我不知道从哪里开始寻找 - 没有尝试改变特定进程的带宽,所以我想不出 PHP7 会减慢什么。跨度>
    【解决方案3】:

    我在 PHP 7.0.12 上的 curl 有同样的问题,我在 cli 和 fpm 模式下运行并且下载速度非常慢,速度从 100Mbps 下降到只有 1~2 Mbps/s,我切换到 php 5.6 并解决了问题,所以这不是网络问题,我确定 希望我的信息对某人有所帮助

    【讨论】:

      【解决方案4】:

      你可以看到这样的 php-curl 版本:

      php5 --ri curl php7 --ri curl

      有时,低版本会导致它。

      【讨论】:

        猜你喜欢
        • 2015-11-19
        • 1970-01-01
        • 2012-04-08
        • 2010-12-30
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        相关资源
        最近更新 更多