2010-06-20 30 views
1

我似乎無法弄清楚這一點。使用Cron一次只允許一個PHP腳本的實例遇到麻煩

我有一個驗證器類型的腳本,驗證我的服務器上的某些文件(檢查是否存在,其內容等)。我希望它只能連續運行一次,而不是更多。目前的解決方案我似乎沒有工作,我猜由於超時(也可能是其他原因)。對於我驗證的每個文件,我將php超時設置爲60秒。我在腳本的頂部有這個:

$trigger_file2 = 'path/to/a/randomfile'; 

    if (file_exists($trigger_file2)){ 
     //another script is working, exit 
       exit; 
    } 

    // create file inside app 
    $handle = fopen($trigger_file2, 'w'); 
    fwrite($handle, '0'); 
    fclose($handle); 

在腳本結尾處,我只是在觸發器文件上使用unlink()。由於可能的超時以及可能的其他原因,觸發文件並不總是被刪除並導致問題。我還嘗試添加檢查觸發文件被修改時間的代碼,並且如果超過10分鐘,它將被刪除,但這實際上效率很低,因爲問題經常發生。

有關如何解決此問題的任何想法?我想過用PID來運行腳本,但是我使用CakePHP作爲腳本,所以每個進程看起來都像使用index.php(我認爲)。

有關如何做到這一點的任何其他想法?非常感謝幫助。

回答

3

我建議你製作的鎖不是文件本身,而是一個實際的file lock

$fp = fopen($trigger_file2, "r+"); 

if (!flock($fp, LOCK_EX | LOCK_NB)) { 
    die("another script running"); 
} 

LOCK_NB在Windows上不受尊重,但您似乎沒有使用它。

+0

感謝您的幫助! 只是爲了確保,您發佈的代碼足以滿足整個腳本的需求嗎?有可能在一個甚至不存在的文件上創建一個鎖?我只是不是100%如何使用這個。我閱讀羊羣手冊,但簡單的解釋會很棒! 非常感謝。 – 2010-06-20 21:56:11

+0

@ user371699只需在其中添加腳本即可。就像我說的那樣,如果文件不存在,'fopen'會失敗,你可以用寫模式打開它來強制創建。 – Artefacto 2010-06-20 22:03:04

+0

爲什麼不鎖定文件本身? – lony 2011-02-04 01:46:06