2013-09-26 183 views
2

我有一個cron腳本,可以爲網站提供新內容,並將需要的條目保存到數據庫中。條目被md5哈希和驗證,以防止欺騙。但是我注意到,有時候有兩個事件同時運行,並且哈希方法在這個時候失敗了,因爲我在插入到DB中的每個pregmatches中有兩個。防止PHP腳本同時運行

有人可以推薦最好的方法來防止這種情況在將來發生。

我已經考慮通過檢查日誌文件來鎖定執行,但在這種情況下,如果中間存在錯誤,腳本可能會永久鎖定。

我正在研究設置$ _SESSION ['lock'],所以在這種情況下,如果它鎖定並中斷,會話將在某個時間點過期。

任何想法?

+0

可能使用你有鎖定的想法,但包括LastActive時間戳?然後您的腳本可以檢查啓動時的最後活動時間戳,如果超過10分鐘左右,請解鎖並繼續。 –

+0

一個基於Memcache的互斥體系。到期內置:) –

+0

當你的腳本啓動時,你可以從'ps'查看是否有一個同名腳本已經在運行。如果是,請退出新實例。 – halfer

回答

1

我認爲$_SESSION應該從Web服務器運行,而不是命令行。

我會將上次活動時間存儲在一個文件中。如果cron正常完成其工作,則刪除該文件。

當cron腳本運行時,請檢查文件。如果文件不存在,或者上一個活動比特定時間段早,則繼續執行,否則 - 停止。

這也很容易實現。

檢查,如果腳本應該運行:對某些腳本的生命週期點

if(file_exists('lock.txt') && file_get_contents('lock.txt') > (time() - 60)){ 
    die('Should not run!'); 
} 

登錄活動:

file_put_contents('lock.txt', time()); 
+0

我最終做了類似的事情,但增加了數據庫輸入,而不是實際的日誌文件。儘管如此,仍然不確定哪兩個更好。這是額外的數據庫連鎖反對額外的讀/寫。 – Koffeehaus

+0

另外,是的,它以前沒有出現過,但會話不是從終端開始工作。實際上,這很有意義。 – Koffeehaus

+0

數據庫無論如何都以物理讀/寫結束:)我只是認爲file_put/get_contents是超級方便的功能,易於使用,因此代碼比數據庫中的選擇/插入更短。無論如何,主要的是這個想法。 –