很多情况下我们需要让php在后台执行某个程序,同时又不影响页面的输出,以下是我总结的几种实现方式
exec
这是最简单的方式
%s 2>&1 & echo $! > %s", $cmd, $outputfile, $pidfile));
调用$cmd命令,将输出重定向到$outputfile,不显示错误信息,同时将进程id输出到$pidfile。
这样也方便监控,比如判断该进程是否还在运行
2){ return true; } }catch(Exception $e){} return false;}
注意:如果直接调用exec来运行某个命令,或者在该命令后面加个"&",php还是会等待该命令运行完成再执行下面的操作。
proc_open/proc_close
这个方法很有意思,先用proc_open运行一段后台程序,然后用proc_close来关闭proc_open,结果程序就在后台运行了,同时php也会继续执行下去
/path/to/output &", array(), $foo));
pcntl_fork
使用php的多线程来达到目的,原理就是复制一个子线程,同时杀死父线程(不支持windows)。
/path/to/output');
header
使用这个方法的前提是使用http协议,同时目标文件可控,最好在一个域下。因为必须要建立http连接才行,所以稍微有点费时。原理是通过header输出’Connection:close’头,中断http连接,同时后面的代码继续执行。