首頁  >  文章  >  後端開發  >  關於php中腳本守護程式實作原理的方法分析

關於php中腳本守護程式實作原理的方法分析

黄舟
黄舟原創
2017-07-20 13:45:091244瀏覽

這篇文章主要介紹了php腳本守護進程原理與實現方法,較為詳細的分析了php腳本守護進程的實現思路、原理、格式及具體實現方法,需要的朋友可以參考下

本文實例講述了php腳本守護程式原理與實作方法。分享給大家供大家參考,具體如下:

思路:

#1. while 循環,若目前沒有資料要操作可以休眠;
2. crontab 腳本每隔固定時間段執行該腳本,執行時先偵測是否已執行,若無執行,有則跳過。
3. nohup  後台執行
4. flock -xn  加鎖

實例:

##要執行程式碼:index. php


<?php
set_time_limit(0);
//死循环
while(1) {
  $message = &#39;1111111&#39; . "\n";
  error_log($message);
  sleep(5);
}


#/tmp/lock/test1.lock 为当前进程要锁定的文件,不同的进程配置不同的锁文件,该文件会自动创建
* * * * * flock -xn /tmp/lock/test1.lock -c &#39;nohup php index.php >> /php/test.log 2>&1 &&#39;
* * * * * flock -xn /tmp/mytest.lock -c &#39;php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log&#39;

在寫好的php腳本。為防止守護程式記憶體溢出,建議定期偵測記憶體佔用。

將以下程式碼放到業務腳本中:


if(memory_get_usage()>100*1024*1024){
  exit(&#39;内存溢出&#39;);//大于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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn