活到老学到老  

记录遇到问题的点点滴滴。

PHP 脚本后台执行

8年前发布  · 1773 次阅读

1 问题
经常有需要在后台运行的任务,一次性脚本,或者守护方式运行的脚本。我们可以用crontab来定时启动或者手工启动,但是如果想一次性启动两个关联的脚本,如何完成呢?

2,两种方式
方式1:ignore_user_abort函数
场景:通过web页面提交,运行一段脚本,该脚本运行需要很长时间。例如发送邮件的脚本程序。

参考代码如下:

<?php
ignore_user_abort(); // 后台运行
set_time_limit(0); // 取消脚本运行时间的超时上限
do {
    sleep(60); // 休眠1分钟
} while (true);

方式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 &)