1. 程式人生 > >php 守護程序 (簡單)

php 守護程序 (簡單)

首先需要解釋的是什麼是守護程序。

守護程序就是在後臺一直執行的程序。比如我們啟動的httpd,mysqld等程序都是常駐記憶體內執行的程式。

針對需求進行分析:

需求:有一個常駐佇列messageQueue(假設在redis記憶體中),這個佇列會有可能有請求不定期的往佇列中增加元素。同時我們要求在佇列中有元素的時候,按照佇列順序將元素pop出來,並進行處理(假設這個處理只是echo ‘test’);

解決方法:

現在假設已經有了兩個函式

function oPopMessageQueue(){ …} //獲取佇列最後一個元素;

function vDealElement($element) { …} 處理元素;

要求寫出一個守護程式,完成上面的需求。

程式:

好了,這個程式很容易想到,可以使用while迴圈來做

while(true)
{
    if( $element  = oPopMessageQueue())
    {
        vDealElement($element);
    }   
}

考慮1 : 這個程式如果一直跑的話已經可以滿足上面的需求了.

但是考慮到:1 用php程序跑有可能會由於各種情況(比如執行時間過長),程序掛了,這樣程式就無法自動重連了.

方法:使用cron

我們在定時指令碼中每10分鐘起一個程序跑這個程式。

然後設定這個程式的執行時間為10分鐘,10分鐘後自動取消,於是程式碼變成

while(true)
{
    if($element = oPopMessageQueue())
    {
        vCheckTimeLimit();
        vDealElement($elemnt);
    }
}
 
$timeStart = 0;
function vCheckTimeLimit()
{
    global $timeStart;
    if(empty($timeStart))
    {
        $timeStart = time();
    }   
     
    if(time() - $timeStart > 60
*10) { exit; } }
考慮2,可能會有這種需求: 需要有隨時讓指令碼暫停的功能: 於是考慮使用檔案來增加暫停功能  
while(true)
{
    if($element = oPopMessageQueue())
    {
        vCheckTimeLimit();
        vCheckEnd();
        vDealElement($elemnt);
    }
}
 
 
function vCheckEnd()
{
    if(file_exists("/home/JesephYe/end"))
    {
        exit;
    }
}

考慮3, 是否可以改成多執行緒的程式,讓執行的效率更高?

這個只要把cron的10分鐘起一個程序的限制改成每1分鐘起一個程序就好了

這樣能保證有10個執行緒在執行程式

但是有一個基本要求是:oPopMessageQueue()是一個原子操作