每5分钟运行一次PHP脚本并避免竞争条件

Imb*_*bue 7 php cron

我有一个php脚本需要每5分钟运行一次.目前我正在使用一个cron作业来运行它(并且效果很好)但是我的主机只允许最少15分钟的时间.

所以我的问题是,我可以使用访问者每5分钟触发一次php脚本的运行.我可以轻松记录上次运行的时间,并根据已用时间重新运行它.

但是,我担心比赛条件.重要的是脚本每5分钟才运行一次.

我的脚本大约需要60秒才能运行.在此期间它会写入几个文件.如果脚本多次运行,则会损坏文件.此外,如果我没有10分钟的输入,那么当下一个输入器到达时运行一次是好的.

有没有一些标准的方法来完成这项任务?

谢谢!

Bra*_*ley 6

您是否考虑让脚本运行无限循环,并sleep在迭代之间等待5分钟?

for (;;)
{
  perform_actions();
  sleep(300);
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以拥有一个文件(例如,is_running),并在最后发布的脚本开头获取一个独占.至少这种方式你不会做任何破坏性的事情.

您也可以将这两种解决方案结合起来

$fp = fopen("is_running", "r+");

/* is it already running? */
if (! flock($fp, LOCK_EX | LOCK_NB)) return;

for (;;)
{
  perform_actions();
  sleep(300);
}
Run Code Online (Sandbox Code Playgroud)

然后让cron工作每15分钟运行一次.如果进程仍在运行,它将会挽救,否则它将重新启动并每5分钟恢复一次.

  • 只是为了让大家知道,主机允许我的脚本运行大约20分钟。杀死前26小时。此后不久,cron突然弹出另一个窗口,发现该文件已解锁并且我又恢复了业务。让我感到恐惧的一件事是,如果主机在写入数据时杀死了我的脚本,将会发生什么。在这种情况下,数据可能会被破坏,直到cron有机会运行另一个脚本。换句话说,一年几次,我可能要为损坏的数据提供大约5-10分钟的服务。 (2认同)