防止 PHP 脚本并发运行


Prevent PHP scripts from running concurrently

我有一个cron脚本,可以抓取网站以获取新内容并将我需要的条目保存到数据库中。条目经过 md5 哈希和验证,以防止受骗。但是,我注意到有时会同时运行两个实例,并且哈希方法此时失败,因为我将每个预匹配项中的两个插入到数据库中。

有人可以推荐防止将来发生这种情况的最佳方法吗?

我已经考虑过通过检查日志文件来锁定执行,但在这种情况下,如果中间出现错误,脚本可能会被永久锁定。

我正在考虑设置 $_SESSION['lock'],所以在这种情况下,如果它锁定并中断,会话必然会在某个时候过期。

有什么想法吗?

我认为从 Web 服务器而不是命令行运行时应该保留$_SESSION

我会将上次活动时间存储在文件中。如果 cron 正常完成其工作,则删除该文件。

当 cron 脚本运行时,请检查文件。如果文件不存在,或者最后一个活动早于某个时间跨度,则继续执行,否则 - 停止。

这也很容易实现。

检查脚本是否应运行:

if(file_exists('lock.txt') && file_get_contents('lock.txt') > (time() - 60)){
   die('Should not run!');
}

记录某些脚本生命周期点上的活动:

file_put_contents('lock.txt', time());