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

时间:2011-05-10 13:37:42

标签: php shell-exec

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

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

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

1 个答案:

答案 0 :(得分:2)

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秒。