2012-05-28 28 views
3

我已經看到一個PHP代碼,它使用shell命令確定此進程是否正在運行,但我已經丟失了它。你能給我一個提示如何做到這一點?如何以單身身份運行php進程

這個想法是創建一個php文件並使用php -f作爲cron作業運行此文件。腳本的執行時間可能是10秒,但也可能是10分鐘。我需要每分鐘運行一次cron,並且如果前一分鐘的cron仍在運行 - 停止新運行並讓另一個運行完成。

我不是很好的shell編程,所以我需要一些幫助。

P.S這個想法是創建一個守護進程,而不會在後臺放置一個無盡的PHP進程。

回答

2

多種用途,下面的代碼就可以了(有可能是一個競爭條件,但對於細微的cronjob這可能是非常罕見):

if (file_exists($lockfilename)) { 
    ... // lock is already taken 
} else { 
    if (!file_put_contents($lockfilename, $lockstring)) { 
     error("unable to write $lockfilename"); 
    } 
    $lock_taken = true; 
    ... // do what you have to do 
    if (!unlink($lockfilename)) { 
     warning("unable to unlink $lockfilename"); 
    } 
    $lock_taken = false; 
} 

全局變量$lock_taken可確保有用每當執行停止時鎖定文件被刪除。 $lockstring可能是一個日期或一個Unix時間戳,如果它顯然太舊(但是filemtime()可能就足夠了),這對於移除鎖可能很有用。

如果你絕對不能冒險競態條件,你必須做一些像

if (!($lockfile = fopen($lockfilename, "x"))) { 
    ... // lock is already taken 
} else { 
    $lock_taken = true; 
    ... // write something to lockfile (optional) 
    fclose($lockfile); 
    ... // do what you have to do 
    if (!unlink($lockfilename)) { 
     warning("unable to unlink $lockfilename"); 
    } 
    $lock_taken = false; 
} 

這僅適用於本地的lockfiles作品,雖然。

3

您應該嘗試獲取鎖文件上的獨佔非阻塞鎖。如果你成功了,你的過程是唯一正在運行的實例,你應該保持鎖定,直到你終止。如果你沒有成功獲得鎖,那麼已經有另一個正在運行的實例,你應該終止。

1

獨佔文件鎖定方法比'檢查文件是否存在'更好,因爲如果在刪除文件之前腳本崩潰了,那麼鎖定仍然會存在。

下面是文件鎖定代碼:

//Allow only one instance 
$fileHandler = fopen('file_lock.lock', 'w'); 
$hasLock = flock($fileHandler, LOCK_EX | LOCK_NB); 
if (!$hasLock) 
    die("Another instance is already running"); 

//do work 

//release lock 
flock($fileHandler, LOCK_UN); 
fclose($fileHandler); 

釋放鎖塊是可選的,因爲系統會自動腳本執行後解除鎖定。

相關問題