2014-09-30 42 views
1

我有一個php腳本,處理並創建大量使用cron作業每5分鐘運行的圖像。我希望能夠限制這一點,以便每次只能運行一次,如果每次運行時間超過5分鐘,則不會重疊。PHP - 限制與flock的cron作業重疊()

flock()似乎是實現這一目標的最佳方式,但我很難理解我應該如何將其添加到我現有的腳本中。我的cron作業是安裝運行下面的文件 -

images.php:

$array=array("Volvo","BMW","Toyota","Audi","Ford","Alfa","Porsche","Mercedes"); 

foreach ($array as $car) { 
    generateImageCustomFunction($car); 
} 

我想用這樣基於示例非阻塞鎖:

$fp = fopen('/tmp/lock.txt', 'r+'); 

if(!flock($fp, LOCK_EX | LOCK_NB)) { 
    echo 'Unable to obtain lock'; 
    exit(-1); 
} 

fclose($fp); 

是`lock.txt'只是一個存儲/指示鎖的純文本文件,或者是我試圖運行的實際文件 - 在這種情況下,images.php

也在哪裏我實際上堅持我現有的代碼在上面?

+1

這只是一個名爲「lock.txt」的文件。當你實際上有或沒有文本完全取決於你。文件的僅僅存在性應該足以表明你已經運行了你的腳本。例如'if(file_exists('/ tmp/lock.txt')){die(「Already running」); }' – 2014-09-30 15:29:03

+0

問題是,如果腳本死了,文件在那裏運行第二個cron不會運行圖像部分,羊羣,當腳本死亡解鎖imediately – BojanT 2014-09-30 15:37:47

+0

非常抱歉,如果這聽起來愚蠢但我不創建lock.txt文件首先,它僅在鎖定/運行時創建? – 2014-09-30 15:38:16

回答

1

你的代碼放在這裏:

$fp = fopen('/tmp/lock.txt', 'w'); 

if(!flock($fp, LOCK_EX | LOCK_NB)) { 
    echo 'Unable to obtain lock'; 
    exit(-1); 
} 

// YOUR CODE HERE  
sleep(5); 

fclose($fp); 

lock.txt只是握着你的鎖。您需要對此文件進行寫入才能首先創建它。併爲您的鎖定文件使用一個唯一的名稱,所以它不會干擾其他進程。