2013-09-26 60 views
2

我有一个cron脚本,可以为网站提供新内容,并将需要的条目保存到数据库中。条目被md5哈希和验证,以防止欺骗。但是我注意到,有时候有两个事件同时运行,并且哈希方法在这个时候失败了,因为我在插入到DB中的每个pregmatches中有两个。防止PHP脚本同时运行

有人可以推荐最好的方法来防止这种情况在将来发生。

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

我正在研究设置$ _SESSION ['lock'],所以在这种情况下,如果它锁定并中断,会话将在某个时间点过期。

任何想法?

+0

可能使用你有锁定的想法,但包括LastActive时间戳?然后您的脚本可以检查启动时的最后活动时间戳,如果超过10分钟左右,请解锁并继续。 –

+0

一个基于Memcache的互斥体系。到期内置:) –

+0

当你的脚本启动时,你可以从'ps'查看是否有一个同名脚本已经在运行。如果是,请退出新实例。 – halfer

回答

1

我认为$_SESSION应该从Web服务器运行,而不是命令行。

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

当cron脚本运行时,请检查文件。如果文件不存在,或者上一个活动比特定时间段早,则继续执行,否则 - 停止。

这也很容易实现。

检查,如果脚本应该运行:对某些脚本的生命周期点

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

登录活动:

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

我最终做了类似的事情,但增加了数据库输入,而不是实际的日志文件。尽管如此,仍然不确定哪两个更好。这是额外的数据库连锁反对额外的读/写。 – Koffeehaus

+0

另外,是的,它以前没有出现过,但会话不是从终端开始工作。实际上,这很有意义。 – Koffeehaus

+0

数据库无论如何都以物理读/写结束:)我只是认为file_put/get_contents是超级方便的功能,易于使用,因此代码比数据库中的选择/插入更短。无论如何,主要的是这个想法。 –