我使用 cURL 调用 PHP 中的 REST 端点来获取一些 JSON 数据:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
echo $result;
curl_close($ch);
在我的本地主机上使用上述代码需要 2.5 秒才能获取数据。在实时服务器上运行相同的代码大约需要 7.5 秒。当直接在浏览器上打开该 URL 时,只需 1.5 秒。
我的问题是:为什么 cURL 需要这么长时间才能在实时服务器上获取数据?我该如何解决这个问题?
下面是输出curl_getinfo($ch)
在服务器上:
Array
(
[content_type] => application/json
[http_code] => 200
[header_size] => 420
[request_size] => 113
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 7.305496
[namelookup_time] => 0.150378
[connect_time] => 0.473187
[pretransfer_time] => 0.473237
[size_upload] => 0
[size_download] => 1291504
[speed_download] => 176785
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => 0
[starttransfer_time] => 1.787901
[redirect_time] => 0
[redirect_url] =>
[certinfo] => Array
(
)
[primary_port] => 80
[local_port] => 53962
)
我找到了解决问题的方法。正如我在问题中提到的,该服务在浏览器中加载速度最快。因此,我在 Google Chrome 检查器的“网络”选项卡中检查了请求的“请求标头”。我复制了这些标头并在 PHP 中的 cURL 请求中使用它们。刮掉这些标题后,我发现我需要做的就是添加一个Accept-Encoding
标头。我传递了一个值gzip
像这样:
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
但将其设置为空字符串也可以。
curl_setopt($ch, CURLOPT_ENCODING, '');
根据php.net 手册 http://php.net/manual/en/function.curl-setopt.php对于 CURLOPT_ENCODING:
“Accept-Encoding:”标头的内容。这使得解码
的响应。支持的编码有“identity”、“deflate”和
“gzip”。如果设置了空字符串“”,则包含所有内容的标头
发送支持的编码类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)