【问题标题】:Limit execution time of shell_exec and grab whatever output is generated限制 shell_exec 的执行时间并获取生成的任何输出
【发布时间】:2011-05-10 13:37:42
【问题描述】:

我正在尝试将 PHP 中 shell_exec 的最大执行时间限制为 20 秒,并获取在此期间生成的任何输出。如果 shell_exec 在不到 20 秒内完成,脚本应该直接继续。

更具体地说,我正在开发一个函数,该函数可以遍历 subversion 存储库的大量修订。对于每个修订版,它都会获取 svn diff 并计算添加的行数。问题是如果在修订中提交了非常大的文件,脚本将挂起。因此我试图限制每个 svn diff 命令的执行时间。

popen() 与 sleep() 组合不是一个选项,因为它似乎使脚本在每次迭代中休眠 20 秒,这在 100 次迭代中是不可行的。设置 max_execution_time 也不是一个选项,因为它会返回一个致命错误。

【问题讨论】:

    标签: php shell-exec


    【解决方案1】:

    popen()proc_open 仍然是一个选项,您只需要避免 sleep() 并自己管理执行时间。

    $end = time() + 20;
    while (!feof($stream) && (time() < $end)) {
    
        $output .= fread($stream);
    

    popen 流仍应设置为非阻塞:

    stream_set_blocking($stream, 0);
    

    像这样轮询输出可能仍然有点紧张,所以无论如何你都应该考虑添加一个小的time_nanosleep()。无论哪种情况,time()&lt;$end 检查都将运行时间限制为最多 20 秒。

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多