【问题标题】:Timeout of curl_exec can terminate the script?curl_exec 超时可以终止脚本吗?
【发布时间】:2011-02-19 13:14:26
【问题描述】:

我正在为一些后端任务(不是 Web)使用 PHP 脚本,我发现有时 curl_exec 会终止脚本的执行而不会输出任何错误。我希望我的脚本永远循环运行,对此有什么想法吗?

【问题讨论】:

  • 是的,它用于后端任务。我需要它循环,只要我需要。我需要知道为什么 curl_exec 会终止脚本以及如何避免这种情况
  • 请显示一些代码。你知道 PHP 的 max_execution_time 设置吗?
  • 此任务是否持续运行(即进程启动并持续数小时),还是某种计划任务?

标签: php curl scripting libcurl


【解决方案1】:

如果您希望进程能够无限启动和运行,您需要:

set_time_limit(0);

否则,一旦您的脚本运行了 30 秒(或 max_execution_time 在 php.ini 中指定的任何内容),脚本就会退出并出现错误。这会中断脚本可能正在执行的任何操作,例如从curl_exec()获得回报。

关于使用 PHP 编写守护程序的注意事项(本质上就是您正在做的事情)can be found here

【讨论】:

    【解决方案2】:

    在您的 php 中,您可以设置 CURLOPT_VERBOSE 变量来跟踪问题:

    curl_setopt($curl, CURLOPT_VERBOSE, TRUE);

    然后记录到 STDERR,或使用 CURLOPT_STDERR 指定的文件:

    curl_setopt($curl, CURLOPT_STDERR, './path/to/file.log');

    从命令行,您可以使用以下开关:

    * --verbose to report more info to the command line
    * --trace <file> or --trace-ascii <file> to trace to a file
    

    您可以使用 --trace-time 将时间戳添加到详细/文件输出

    【讨论】:

    • 在您使用上述选项出现错误后,请将其发布,以便我们帮助您修复它:)
    【解决方案3】:

    这很可能是超时问题。

    您可以设置 curl 超时(用于获取网站),例如到 60 秒通过

    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    

    然后您需要将 PHP 超时设置为高于 60 秒,例如

    set_time_limit(90);
    

    这个超时在 Windows 上是实时的,在 Unix 上是 CPU 时间,因此在 Unix 上你需要的时间要少得多。在你的循环中设置 PHP 超时很重要,否则它是总的限制,永远不会满足你的无限循环。

    do {
        set_time_limit(90);
        // curl stuff
    } while (true);
    

    【讨论】:

    • 这样可以避免执行脚本的中断吗?
    • 是的,如果中断的原因是 PHP 超时。如果您有(有意的)无限循环而没有设置超时,那么默认超时迟早会中断脚本。当然,我们不知道您的脚本是否在超时停止之前因其他原因被中断。
    【解决方案4】:

    确保你设置了错误报告,把它放在你的 php 文件的顶部:

    ini_set('display_errors', true);
    error_reporting(E_ALL);
    

    您还可以延长脚本的执行时间:

    ini_set('max_execution_time', 50000);
    

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2018-10-20
      • 1970-01-01
      • 2017-10-31
      • 2021-03-20
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多