2009-09-04 35 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