【问题标题】:PHP cURL timeout in redirections重定向中的 PHP cURL 超时
【发布时间】:2014-07-16 11:28:10
【问题描述】:

我正在我公司网站的一个用例中测试 PHP 中的 303 重定向,我注意到 2 个不同的案例之间存在巨大延迟,一个执行正常,另一个持续 10 秒,我意识到这是我的超时设置(带有 CURLOPT_TIMEOUT 标志)。

测试是尝试重定向后POST查询转换为GET查询的情况。

我也用 301 和 302 重定向对其进行了测试,结果是一样的。终于在这个问题上苦苦挣扎后,我找到了解决方案,我认为分享起来会很有趣。

重定向页面

<?php

header("HTTP/1.1 303 See Other");    
header("Location: http://127.0.0.1/test-303-redirection-2.html");

cURL 示例脚本

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/test-303-redirection-1.php");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "field1=value1&field2=value2");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'host: 127.0.0.1',
    'accept: */*',
    'content-length: 29',
    'content-type: application/x-www-form-urlencoded'
    )
);

$theResponse  = curl_exec($ch);

print_r(curl_getinfo($ch)) ;

此脚本每次执行都会持续 10 秒。

【问题讨论】:

    标签: php redirect curl timeout


    【解决方案1】:

    错误出现在我们的 cURL 包装类中,它使用 POST 字段长度添加了 content-length 标头。这使得标头是这样发送的:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'host: 127.0.0.1',
        'accept: */*',
        'content-length: 29',
        'content-type: application/x-www-form-urlencoded'
        )
    );
    

    只需从数组中删除内容长度标头即可删除超时,并且执行应该是顺利的。我希望这可以帮助某人

    【讨论】:

    • 真正的问题是在将数组传递给 CURLOPT_POSTFIELDS 时,当 cURL PHP 库自动设置内容长度时设置内容长度。如果您自己设置,服务器可能会收到此数据但不响应。
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多