【问题标题】:Setting Curl's Timeout in PHP在 PHP 中设置 Curl 的超时时间
【发布时间】:2023-03-29 06:20:01
【问题描述】:

我正在通过 php 在 eXist 数据库上运行 curl 请求。数据集非常大,因此,数据库始终需要很长时间才能返回 XML 响应。为了解决这个问题,我们设置了一个 curl 请求,它应该是一个很长的超时时间。

$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";

curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);

但是,curl 请求始终在请求完成之前结束(通过浏览器请求时

【问题讨论】:

    标签: php http curl timeout


    【解决方案1】:

    查看文档:http://www.php.net/manual/en/function.curl-setopt.php

    CURLOPT_CONNECTTIMEOUT - 尝试连接时等待的秒数。使用 0 表示无限期等待。
    CURLOPT_TIMEOUT - 允许 cURL 函数执行的最大秒数。

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds
    

    也别忘了放大php脚本自身的执行时间:

    set_time_limit(0);// to infinity for example
    

    【讨论】:

    • 如果脚本在控制台上运行,则不需要set_time_limit(0);
    • @PedroLobito 您提到的是 cli 上 php 的默认配置,但可能已被修改。
    • @cherouvim 在这里显然是正确的(只需运行 php -d max_execution_time=1 -r 'while(true){$r=1*1;}' 或在运行中观察到 cli 没有神奇的“始终无限制”标志。
    • @Pedro Lobito 如果您不在循环中使用它,则不需要set_time_limit(0)
    • CURLOPT_CONNECTTIMEOUT = 0 并不意味着“无限期”curl.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html“设置为零以切换到默认的内置连接超时 - 300 秒。”
    【解决方案2】:

    嗯,在我看来 CURLOPT_TIMEOUT 定义了允许执行任何 cURL 函数的时间量。我认为您实际上应该查看CURLOPT_CONNECTTIMEOUT,因为它告诉 cURL 等待连接完成的最长时间。

    【讨论】:

    【解决方案3】:

    这有一个怪癖,可能与某些人有关...来自 PHP 文档 cmets。

    如果您希望 cURL 在不到一秒的时间内超时,您可以使用 CURLOPT_TIMEOUT_MS,尽管“类 Unix 系统”上存在一个错误/“功能”,如果值

    “如果构建 libcurl 以使用标准系统名称解析器,则传输的该部分仍将使用整秒解析超时,允许的最小超时为一秒。”

    这对 PHP 开发人员意味着“你不能在没有先测试的情况下使用这个函数,因为你无法判断 libcurl 是否使用标准系统名称解析器(但你可以很确定它是)”

    问题是在 (Li|U)nix 上,当 libcurl 使用标准名称解析器时,在名称解析期间会引发 SIGALRM,libcurl 认为这是超时警报。

    解决方案是使用 CURLOPT_NOSIGNAL 禁用信号。这是一个示例脚本,它请求自身导致 10 秒延迟,以便您可以测试超时:

    if (!isset($_GET['foo'])) {
        // Client
        $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
        $data = curl_exec($ch);
        $curl_errno = curl_errno($ch);
        $curl_error = curl_error($ch);
        curl_close($ch);
    
        if ($curl_errno > 0) {
            echo "cURL Error ($curl_errno): $curl_error\n";
        } else {
            echo "Data received: $data\n";
        }
    } else {
        // Server
        sleep(10);
        echo "Done.";
    }
    

    来自http://www.php.net/manual/en/function.curl-setopt.php#104597

    【讨论】:

    【解决方案4】:

    您的代码将超时设置为 1000 。对于毫秒,使用CURLOPT_TIMEOUT_MS

    【讨论】:

      【解决方案5】:

      您需要确保您与文件之间的超时。 在本例中是 PHP 和 Curl。

      要告诉 Curl 在传输仍处于活动状态时永远不会超时,您需要将 CURLOPT_TIMEOUT 设置为 0,而不是 1000

      curl_setopt($ch, CURLOPT_TIMEOUT, 0);
      

      再一次,在 PHP 中,您必须删除时间限制,否则 PHP 它自己(默认为 30 秒后)将根据 Curl 的请求终止脚本。 仅此一项就可以解决您的问题
      此外,如果您需要数据完整性,您可以使用ignore_user_abort 添加一层安全保护:

      # The maximum execution time, in seconds. If set to zero, no time limit is imposed.
      set_time_limit(0);
      
      # Make sure to keep alive the script when a client disconnect.
      ignore_user_abort(true);
      

      客户端断开连接将中断脚本的执行并可能损坏数据,
      例如。非过渡数据库查询,构建配置文件,ecc。,而在你的情况下,它会下载部分文件......你可能会或不关心这个。

      回答这个老问题,因为这个帖子在引擎搜索 CURL_TIMEOUT 的顶部。

      【讨论】:

        【解决方案6】:

        您不能从浏览器运行请求,它将超时等待运行 CURL 请求的服务器响应。浏览器大概1-2分钟就超时了,默认网络超时。

        您需要从命令行/终端运行它。

        【讨论】:

        • +1 -- 超时可能在 curl 外部。您实际上可以通过确保定期输出某些内容来解决浏览器超时问题;浏览器通常会在每次收到更多数据时重置超时。但这是一个技巧。通过 CLI 运行(几乎?)总是更可取的。
        【解决方案7】:

        如果您使用 PHP 作为 fastCGI 应用程序,请确保检查 fastCGI 超时设置。 见:PHP curl put 500 error

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-18
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          相关资源
          最近更新 更多