cURL加载时间太长

7
我正在使用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
)

你尝试过什么来解决这个问题?你卡在哪里了? - Nico Haase
2个回答

16

我找到了解决我的问题的方法。就像我在问题中提到的那样,服务在浏览器中加载速度最快。因此,我在谷歌浏览器检查器的“网络”选项卡中检查了请求的“请求头”。我复制了这些头,并在PHP的cURL请求中使用它们。在分析这些头之后,我发现我只需要添加一个Accept-Encoding头即可。我传递了一个值为gzip的参数,如下所示:

curl_setopt($ch, CURLOPT_ENCODING, 'gzip');

但将其设置为空字符串也可以起到同样的作用。

curl_setopt($ch, CURLOPT_ENCODING, '');

根据php.net手册关于CURLOPT_ENCODING的说明:

"Accept-Encoding: "头部的内容。这使响应能够被解码。支持的编码包括 "identity"、"deflate" 和 "gzip"。如果设置为空字符串 "",则发送一个包含所有支持的编码类型的头部。


如果我使用curl_setopt_array,你有什么解决方案吗? - Fernando Torres

0
$ch = curl_init();
                    curl_setopt($ch, CURLOPT_URL, "set ur url");
                    curl_setopt($ch, CURLOPT_ENCODING , "gzip"); 
                    curl_setopt($ch, CURLOPT_ENCODING, '');    

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    $response  = curl_exec($ch);
                    curl_close($ch);

请查看这个例子。

请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接