代码之家  ›  专栏  ›  技术社区  ›  Cheetah

硬件故障后如何还原此脚本?

php
  •  1
  • Cheetah  · 技术社区  · 15 年前

    我知道这有点笼统,但我相信你会理解我的解释。情况如下:


    以下代码每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”。(我已经有了计算恢复点的逻辑)。

    谢谢。

    3 回复  |  直到 10 年前
        1
  •  6
  •   Residuum    15 年前

    您应该用锁定和解锁文件 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的正在运行的进程,如果该进程是一个PHP脚本。当然,这仍然可能出错,因为在硬件故障后,可能会有另一个PHP脚本获得相同的PID,因此解决方案远不是最佳的。

        2
  •  5
  •   scragar    15 年前

    你不认为使用文件锁更好地解决这个问题吗?(重置发生时,文件锁定也会重置)

    http://php.net/flock

        3
  •  0
  •   Jon W    15 年前

    听起来您在为流程管理执行某种手动信号量。

    也许您应该使用 environment variable 相反。这样,在失败的情况下,您的脚本在恢复时就不会有一个关闭的信号灯。