我知道这有点通用,但我相信你会理解我的解释。情况如下:
以下代码每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 :(得分: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.
}
修改强>
由于flock似乎无法在Windows机器上正常工作,因此您必须使用其他解决方案。从头脑中想出一个可能的解决方案:
不是将1写入var_x,而是编写通过getmypid检索的进程ID。当脚本的新实例读取文件时,它应该使用此ID查找正在运行的进程,并且该进程是PHP脚本。当然,这仍然可能出错,因为在硬件故障后,另一个PHP脚本可能会获得相同的PID,因此解决方案远非最佳。
答案 1 :(得分:5)
您认为使用文件锁会更好地解决这个问题吗? (当重置发生时,文件锁也被重置)
答案 2 :(得分:0)
听起来你正在为流程管理做一些手动信号量。
您可能应该使用environment variable而不是写入文件。这样,如果发生故障,您的脚本在恢复时将没有关闭的信号量。