本文主要和大家介紹php腳本守護進程原理與實現方法,較為詳細的分析了php腳本守護進程的實現思路、原理、格式及具體實現方法,需要的朋友可以參考下,希望能幫助到大家。
想法:
1. while 循環,若目前沒有資料要操作可以休眠;
2. crontab 腳本每隔固定時間段執行該腳本,執行時先偵測是否已在執行,若無執行,有則跳過。
3. nohup 後台執行
4. flock -xn 加鎖
實例:
##要執行程式碼:index. php<?php set_time_limit(0); //死循环 while(1) { $message = '1111111' . "\n"; error_log($message); sleep(5); }
#/tmp/lock/test1.lock 为当前进程要锁定的文件,不同的进程配置不同的锁文件,该文件会自动创建 * * * * * flock -xn /tmp/lock/test1.lock -c 'nohup php index.php >> /php/test.log 2>&1 &' * * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'
將以下程式碼放到業務腳本中:
if(memory_get_usage()>100*1024*1024){ exit('内存溢出');//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端 }
#注意:##nohup 任務查看與關閉方法:
關閉://方法一: ps -e | grep commend kill -9 pid //方法二: fg %n //n为jobs命令查看的进程号
#
//查看后台进程 jobs
使用linux flock 檔案鎖定實現任務鎖定,解決衝突
##格式:
flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command
選項
-s, --shared: 取得一個共享鎖定-x, --exclusive: 取得一個獨佔鎖
-u, --unlock: 移除一個鎖,通常是不需要的,腳本執行完會自動丟棄鎖-n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待
-w, --timeout: 如果沒有立即取得鎖定,等待指定時間
-o, --close: 在執行指令前關閉檔案的說明符號。用於如果命令產生子進程時會不受鎖定的控制
-c, --command: 在shell中執行一個單獨的命令
-h, --help 顯示幫助
-V, - -version: 顯示版本
執行一個php文件,檔案鎖定使用獨佔鎖,如果鎖定則失敗不等待。參數為-xn
* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/ php/test.log'
這樣當任務未執行完成,下一任務判斷到/tmp/mytest.lock被鎖定,則結束目前的任務,下一週期再判斷。
相關推薦:詳解PHP有關守護程式的常見實作方式
以上是php腳本守護程式原理與實作程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!