【问题标题】:cURL timeout, can you handle it elegantly?cURL超时,你能优雅地处理吗?
【发布时间】:2013-10-17 05:46:12
【问题描述】:

如果从服务器获得响应的时间超过 30 秒,cURL 会使 PHP 抛出致命错误。这似乎在我的网络应用程序中发生了很多,尤其是在其他服务器很忙的情况下。让用户看到真的不好看。

我想自己捕获超时并显示一条漂亮的消息,或者,我想知道是否有一种方法可以继续执行 PHP 脚本的其余部分,因为该脚本的其余部分可以执行,即使服务器没有响应(使用默认值)。

老实说,我真的不明白为什么 cURL 会抛出致命错误而不是警告超时。真的很痛苦。

【问题讨论】:

    标签: php curl fatal-error


    【解决方案1】:

    使用这些参数增加 cURL 超时

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 500);
    

    既然您提到了 30 秒,我怀疑您的 PHP 脚本超时时间已过。因此,将其添加到您的 PHP 代码中。

    set_time_limit(0);// 0 is infite limit 
    

    【讨论】:

    • 谢谢你。作为 PHP 新手,我不知道是 PHP 本身允许最多 30 秒的时间来执行脚本。我认为致命错误是由 curl 引发的。谢谢你,它有帮助,但这并不是我真正希望的解决方案。
    • 当然,在开发时将 time_limit 增加到无穷大,但这对于生产来说是个糟糕的主意。
    • 这个答案并没有告诉你如何捕捉错误(这是我正在寻找的),它只是告诉你如何避免错误。甚至可以在不使用该设置的情况下限制 curl_exec 的时间吗?
    【解决方案2】:

    这是对这个问题的稍微更字面的回答。也就是说,curl 仍然会在 30 秒后停止,但您可以捕获错误并继续执行。

    ini_set('max_execution_time', 40); // prevents 30 seconds from being fatal
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); // curl timeout remains at 30 seconds
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
    curl_exec($ch);
    
    if ($error_number = curl_errno($ch)) {
        if (in_array($error_number, array(CURLE_OPERATION_TIMEDOUT, CURLE_OPERATION_TIMEOUTED))) {
            print "curl timed out";
        }
    }
    
    curl_close($ch);
    

    如果您无法控制 max_execution_time,您可以稍微降低 curl 超时时间。

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2010-09-21
      • 2019-01-15
      • 2011-08-08
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      相关资源
      最近更新 更多