PHP 7上的cURL非常慢,但不是PHP 5

时间:2016-09-24 00:46:38

标签: 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);
$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本地计算机上重现该问题。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

对我来说,这看起来像网络延迟问题或带宽问题。如果你检查两者之间的path,你会看到一个下载速度明显快于另一个。使用PHP 5/7-CLI的第一个结果显示@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode!= Activity.RESULT_OK) return; if(requestCode == 1){ if(data==null){ return; } Message msg = (Message) getIntent().getSerializableExtra(iputTextActivity.IPUT_TEXT_RETURN_CONTENT); if(msg == null) //I receive null return; updateData(1); } } ,而第二个结果显示final Message msg = (Message) getIntent().getSerializableExtra(daygramActivity.SER_KEY); //I receive valid //value mDoneButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ EditText edT = (EditText) findViewById(R.id.editText); String input = edT.getText().toString(); Intent data=new Intent(); Bundle mBundle = new Bundle(); msg.setContent(input); mBundle.putSerializable(IPUT_TEXT_RETURN_CONTENT,msg); data.putExtras(mBundle); setResult(Activity.RESULT_OK, data); finish(); } }); ,而它们都具有相同的内容长度speed_download

所以第一个是以~25.9MB /秒的速度下载~32.7MB的文件,而第二个是以~1.9MB /秒的速度下载同一个文件。显然第二个会花费更长的时间。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

php5 --ri curl php7 --ri curl

有时,较低版本可能会导致它。