限制shell_exec的执行时间并获取生成的任何输出


Limit execution time of shell_exec and grab whatever output is generated

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

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

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

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

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

popen 流应该设置为非阻塞:

stream_set_blocking($stream, 0);

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