我使用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);
Run Code Online (Sandbox Code Playgroud)
使用我的localhost上的代码获取数据需要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
)
Run Code Online (Sandbox Code Playgroud)
lit*_*bex 10
我找到了解决问题的方法.正如我在问题中提到的那样,该服务在浏览器中加载速度最快.因此,我在Google Chrome Inspector的"广告联盟"标签中查看了请求的"请求标头".我复制了这些标题,并在PHP的cURL请求中使用它们.在抓取这些标题后,我发现我需要做的就是添加一个Accept-Encoding标题.我通过了gzip这样的值:
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
Run Code Online (Sandbox Code Playgroud)
但将其设置为空字符串也有效.
curl_setopt($ch, CURLOPT_ENCODING, '');
Run Code Online (Sandbox Code Playgroud)
根据CURLOPT_ENCODING 的php.net手册:
"Accept-Encoding:"标题的内容.这使得能够解码响应.支持的编码是"identity","deflate"和"gzip".如果设置了空字符串"",则发送包含所有支持的编码类型的标头.
| 归档时间: |
|
| 查看次数: |
8521 次 |
| 最近记录: |