2009-09-04 10 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が私のために機能していないようです。 Flockは、ファイルが自由になるまでコードを遅らせるように見えますが、これは私が望むものではありません。 – Cheetah

答えて

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マシンで正しく動作するため、他のソリューションに頼らざるを得ません。私の頭の上から考えられる解決法の考え方:

var_xに1を書き込む代わりに、getmypidで取得したプロセスIDを書きます。スクリプトの新しいインスタンスがファイルを読み込むと、このIDを持つ実行中のプロセスを検索し、そのプロセスがPHPスクリプトであるかどうかを調べる必要があります。もちろん、これはまだ間違っている可能性があります。他のPHPスクリプトがハードウェアの障害後に同じPIDを取得する可能性があるため、ソリューションは最適ではありません。

+0

あなたの努力のために+1 – Dooltaz

+0

もう1つ。努力の相手に感謝します。 – Cheetah

+0

投票できません:(十分ではない担当者 – Cheetah

0

プロセス管理のために何らかの手動セマフォを実行しているようです。

ファイルに書き込むのではなく、おそらくenvironment variableを使用してください。そうすれば、失敗した場合には、復元時にスクリプトは閉じたセマフォを持ちません。

+0

PHP.netから: '警告: これらの指令は、セーフモード自体が有効な場合にのみ有効です! ' – scragar

+0

true、scragarの答えはPHPにとってはるかに優れています。私は一般的に考えていただけだった。 –

5

ファイルロックを使用するとこれがうまく解決しないと思いませんか? (リセットが発生すると、ファイルのロックが同様にリセットされます)

http://php.net/flock

+0

私の頭の上に(それについて考えて)オフ - 完璧。 – Cheetah

+0

私はコードを書いている間にあなたを殴った;) – Residuum

関連する問題