如何在硬件故障后恢复此脚本?
我知道这有点泛泛,但我相信你会理解我的解释。情况如下:如何在硬件故障后恢复此脚本?
以下代码每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” 。 (我已经有了计算还原点的逻辑)。
谢谢。
您应该锁定,并与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,所以该解决方案远不是最优的。
这听起来像你正在为流程管理做某种手动信号量。
而不是写入文件,也许应该使用environment variable来代替。这样,如果发生故障,您的脚本在恢复时不会有封闭的信号量。
来自PHP.net:'警告: 这些指令只有在安全模式本身启用时才起作用!' – scragar 2009-09-04 15:43:22
true,scragar的答案对PHP来说更好。我只是在思考一般情况。 – 2009-09-04 15:46:12
你不觉得用文件锁可以更好地解决吗? (当发生复位文件锁被重置为好)
由于某种原因,Flock似乎不适合我。 羊群似乎只推迟代码,直到文件变得*,这是不是我想要的。 – Cheetah 2009-09-04 20:21:09