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等系統調用命令)。