1 问题
经常有需要在后台运行的任务,一次性脚本,或者守护方式运行的脚本。我们可以用crontab来定时启动或者手工启动,但是如果想一次性启动两个关联的脚本,如何完成呢?
2,两种方式
方式1:ignore_user_abort函数
场景:通过web页面提交,运行一段脚本,该脚本运行需要很长时间。例如发送邮件的脚本程序。
参考代码如下:
<?php
ignore_user_abort(); // 后台运行
set_time_limit(0); // 取消脚本运行时间的超时上限
do{
sleep(60); // 休眠1分钟
}while(true);
?>
参考网页:http://www.01xj.net/0/?p=266
方式2: 后台启动,使用exec命令
后台启动daemon进程(不间断的运行)。比如异步处理不断输入的消息队列
其中有几个概念需要理解:1,daemon进程(使用fg bg jobs命令可查看);2,输出重定向
例子:
通过运行a.php来执行b.php
a.php中包含该语句:
exec('php b.php');//b.php能够运行,但如果a.php退出,b.php一起退出
exec('php b.php&');//b.php后台运行,但a.php也会一直运行,手动kill掉a.php不影响b.php的运行
exec('php b.php > /dev/null &');//b.php后台运行,a.php调起b.php后,继续执行之后的命令
关键点是:'> /dev/null &'
这个也不一定输出到/dev/null,可以输出给文件的(>> /tmp/tmp.log &)
重要参考文章:
理解标准输出,标准错误,及其使用方法和原理
http://www.cnblogs.com/caolisong/archive/2007/04/25/726896.html
参考文章:
http://blog.csdn.net/fishg/article/details/6138348
http://www.360doc.com/content/07/0529/19/3500_527618.shtml
http://murray.cn/index.php/2012/03/how-to-nohup-linux-background-command-php-jobs-fg/
http://www.williamlong.info/archives/482.html
http://www.justwinit.cn/post/5550/
或许还有另外的途径可以完成:popen函数(exec/system/shell_exec等系统调用命令)。