使用PHP执行超时时间较长的系统命令


Use PHP to execute system command with a long timeout period?

我们需要在没有SSH访问权限的服务器上解压缩一个非常大的存档文件。我们的一个替代选项是通过PHP执行系统命令来解压缩文件。

问题是它需要相当长的时间来解压缩/解压缩文件。PHP在完成之前就超时了。

有没有一种方法可以让untar命令完全执行,无论PHP脚本是否超时?像异步执行吗?

或者,如何将PHP超时时间临时设置为极高,以便它有足够的时间完成文件的无标记?

来自手册:

set_time_limit()函数和configuration指令max_execution_time只影响脚本的执行时间它本身在执行之外发生的活动上花费的任何时间诸如使用system()的系统调用、流操作等,在确定最大值时不包括数据库查询等脚本运行的时间。在Windows上不是这样其中测量的时间是真实的。

可能发生的情况是您的客户端(浏览器)超时。这样的断开连接可能会导致脚本中止。为了防止这种情况,你可以做:

ignore_user_abort(true);

然后,您将需要第二个脚本来检查进度。一个想法是将tar的输出写入一个文件,第二个脚本可以检查该文件的末尾,看看是否完成了。另一种方法是调用一个shell脚本,该脚本反过来运行tar。该shell脚本可以检查返回代码并用其结果触摸文件,也可以在工作时创建一个基本的锁定文件。

如果您的服务器配置不能阻止您修改这些值,那么应该这样做:

set_time_limit( 0);
ini_set( 'max_execution_time', 0);

参见set_time_limitmax_execution_time

如果服务器运行在*nix系统上,nohup命令可能可用。即

nohup tar ... >outfile.txt

然后,您可以让PHP脚本扫描outfile.txt,直到操作结束