cURL在php7上非常慢,但在php5上却不是

cURL在php7上非常慢,但在php5上却不是,php,curl,Php,Curl,对于我来说,使用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)

对于我来说,使用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)
}
重要的部分是总时间,PHP5是1.3秒,PHP7是16.9秒

当对请求设置超时时,接收的字节数与超时成正比-数据传输速度非常慢,而不是因为存在某种阻碍而在一段时间内无法传输任何内容,然后一次性传输整个内容


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

对我来说,这只是一个网络延迟问题或带宽问题。如果检查两者之间的
speed\u download
,您会发现其中一个下载速度明显快于另一个。使用PHP5/7-CLI的第一个结果显示为
“speed_download”=>float(27243693)
,而第二个结果显示为
“speed_download”=>float(2034178)
,两者的内容长度相同
“download_content_length”=>float(34327108)


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

我在php 7.0.12上有同样的问题,我在cli和fpm模式下运行,下载速度非常慢,速度从100Mbps降低到只有1~2Mbps/s,我切换到php 5.6并解决问题,所以我确信这不是网络问题
希望我的信息能帮助别人解决Debian Stretch上PHP7的同样问题。我注意到高系统cpu时间:0.07s用户10.02s系统92%cpu 10.859总计

禁用透明页面后问题已解决:

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

它不会直接影响curl下载,但会减慢php内存分配。请参阅:

您可以看到如下php curl版本:

php5--ri旋度
php7——ri旋度


有时,较低版本可能会导致这种情况。

这是在同一台服务器上吗?@ceejayoz是的,所有测试(PHP7、PHP5和命令行curl(我没有确切的数字,但与PHP5的速度大致相同))都是在同一台服务器上执行的。您是在虚拟机上运行此测试吗?@Sherif否,这是一个拥有大量资源的专用服务器。我可以在每次运行它们时都复制结果。但是两者都在同一台服务器上运行,而且我可以可靠地复制结果,所以这不仅仅是一些随机的尖峰。我相信你,但是没有证据表明PHP在这里出了错。您可能在某个地方有一些网络配置,它通过端口甚至进程(如果是基于软件的)来限制入站带宽。不清楚是什么导致了这个问题,但是数据指向的是带宽问题,而不是PHP问题。换句话说,如果传输速度慢,PHP完成传输的速度不可能比完成传输的速度快。然而,如果不进一步研究该系统上的网络配置,为什么一个版本的PHP下载文件的速度比另一个版本的PHP慢的问题仍然是完全未知的。我可以告诉你,我刚刚在PHP5和PHP7本地运行了你的代码,在以相同速度下载时得到了一致的结果。所以没有迹象表明它是PHP。必须是特定于您的设置。我知道下载速度很慢,但我正在试图找出原因。您可能是对的,这是一个配置问题,但我不知道从哪里开始寻找-没有人试图改变特定进程的带宽,所以我想不出有什么可能会减慢PHP7。