cURL加载时间太长

lit*_*bex 4 php apache curl

我使用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".如果设置了空字符串"",则发送包含所有支持的编码类型的标头.