2009-09-04 76 views
1

我知道這有點泛泛,但我相信你會理解我的解釋。情況如下:如何在硬件故障後恢復此腳本?


以下代碼每10分鐘執行一次。當變量「var_x」被引用時,它總是讀/寫到外部文本文件中。

if (var_x != 1) 
{ 
    var_x = 1; 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    var_x = 0; 
} 
else 
{ 
    // exit script as it's already running. 
} 

的問題是:如果我模擬硬件故障(做當腳本執行硬復位),則主要腳本邏輯永遠不會再執行,因爲「var_x」永遠是「1」 。 (我已經有了計算還原點的邏輯)。

謝謝。

+0

由於某種原因,Flock似乎不適合我。 羊羣似乎只推遲代碼,直到文件變得自由,這是不是我想要的。 – Cheetah 2009-09-04 20:21:09

回答

6

您應該鎖定,並與flock解鎖文件:

$fp = fopen($your_file); 
if (flock($fp, LOCK_EX)) {) 
{ 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    flock($fp, LOCK_UN); 
} 
else 
{ 
    // exit script as it's already running. 
} 

編輯:

由於羊羣好像不在Windows機器上正常工作,你必須訴諸其他解決方案。從我的頭頂上想出一個可能的解決方案:

而不是寫1到var_x,寫入通過getmypid檢索到的進程ID。當腳本的新實例讀取文件時,它應該使用此ID查找正在運行的進程,並且該進程是否爲PHP腳本。當然,這仍然可能會出錯,因爲在硬件故障後可能有另一個PHP腳本獲得相同的PID,所以該解決方案遠不是最優的。

+0

+1爲你的努力 – Dooltaz 2009-09-04 15:51:53

+0

另一個+1。感謝您的努力伴侶。 – Cheetah 2009-09-04 16:00:11

+0

不能投票:(沒有足夠的代表 – Cheetah 2009-09-04 16:00:54

0

這聽起來像你正在爲流程管理做某種手動信號量。

而不是寫入文件,也許應該使用environment variable來代替。這樣,如果發生故障,您的腳本在恢復時不會有封閉的信號量。

+0

來自PHP.net:'警告: 這些指令只有在安全模式本身啓用時才起作用!' – scragar 2009-09-04 15:43:22

+0

true,scragar的答案對PHP來說更好。我只是在思考一般情況。 – 2009-09-04 15:46:12

5

你不覺得用文件鎖可以更好地解決嗎? (當發生復位文件鎖被重置爲好)

http://php.net/flock

+0

關閉我的頭頂(思考) - 完美。 – Cheetah 2009-09-04 15:43:49

+0

你打我時,我寫的代碼;) – Residuum 2009-09-04 15:49:12