防止PHP脚本并发运行

防止PHP脚本并发运行,php,session-variables,crontab,web-crawler,Php,Session Variables,Crontab,Web Crawler,我有一个cron脚本,可以在网站上搜索新内容,并将需要的条目保存到数据库中。条目经过md5哈希和验证,以防止重复。然而,我注意到有时会同时运行两个匹配项,而散列方法在这一点上失败了,因为我将每个匹配项中的两个插入到数据库中 有人能推荐最好的方法来防止将来发生这种情况吗 我考虑通过检查日志文件来锁定执行,但在这种情况下,如果中间有错误,脚本可能会永久锁定。 我正在研究设置$_SESSION['lock'],因此在本例中,如果它锁定并中断,会话一定会在某个时候过期 有什么想法吗?我认为从web服务器

我有一个cron脚本,可以在网站上搜索新内容,并将需要的条目保存到数据库中。条目经过md5哈希和验证,以防止重复。然而,我注意到有时会同时运行两个匹配项,而散列方法在这一点上失败了,因为我将每个匹配项中的两个插入到数据库中

有人能推荐最好的方法来防止将来发生这种情况吗

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

我正在研究设置$_SESSION['lock'],因此在本例中,如果它锁定并中断,会话一定会在某个时候过期


有什么想法吗?

我认为从web服务器运行时应该保留
$\u会话
,而不是命令行

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

当cron脚本运行时,检查该文件。若文件不存在,或者最后一个活动的时间超过某个时间跨度,则继续执行,否则-停止

这也很容易实现

检查脚本是否应运行:

if(file_exists('lock.txt') && file_get_contents('lock.txt') > (time() - 60)){
   die('Should not run!');
}
在某些脚本的生命周期点记录活动:

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

可能使用您已有的锁定思想,但是否包含一个最后活动的时间戳?然后,您的脚本可以在启动时检查最后一个活动时间戳,如果超过10分钟左右,则解锁并继续。基于Memcache的互斥系统。Expiration内置:)当脚本启动时,可以从
ps
检查是否有同名脚本正在运行。如果是,请退出新实例。我最后做了类似的事情,但使用了额外的DB条目,而不是实际的日志文件。不过,我仍然不确定这两个选项中哪一个更好。这取决于额外的DB conn来防止额外的读/写。此外,是的,我以前没有想到过,但会话在终端上无法工作。实际上,这很有道理。无论如何,数据库最终都会有一个物理读/写:)我只是觉得file\u put/get\u contents是一个超级方便的函数,也很容易使用,所以代码比数据库中的select/insert短。不管怎样,最重要的是想法。