我有cron job - php脚本,在5分钟内调用一次。我需要确保之前调用的php脚本已经完成执行 - 不想混合正在处理的数据。
我曾经使用过三种方法:
创建包含运行状态标志的辅助文本文件。执行的脚本分析文件的内容,如果flag设置为true则中断。这是最简单的解决方案,但每次我创建这样的脚本时,我都觉得我再次发明了一辆自行车。是否有满足大多数需求的众所周知的模式或最佳实践?
添加UNIX服务。这种方法对于cron工作来说是最好的。但是开发和测试UNIX服务需要花费更多时间:需要良好的bash脚本知识。
使用数据库跟踪流程。很好的解决方案,但有时不鼓励数据库使用 - 再也不想发明自行车,希望已经有一个很好的灵活解决方案。
也许你有其他建议如何管理php脚本的单一处理?很高兴听到你对此的看法。
答案 0 :(得分:2)
我建议使用文件锁定机制。您创建了一个文本文件,并使您的进程独占锁定(请参阅php flock function:http://us3.php.net/flock)。如果它无法锁定,则退出,因为正在运行另一个实例。 使用文件锁定的好处是,如果您的PHP脚本意外死亡或被杀死,它将自动释放锁定。如果您使用纯文本文件作为状态,则不会发生这种情况(如果脚本设置为在执行结束时更新此文件并且意外终止,则会留下不真实的数据)。
答案 1 :(得分:1)
http://php.net/flock使用LOCK_EX就足够了。
答案 2 :(得分:1)
在grep命令的帮助下,您可以使用ps命令检查脚本当前是否正在运行。如果你需要关于这些的信息,“man ps”和“man grep”会告诉你关于这些unix / linux命令的所有信息。
我们假设您的脚本名为'my_script.php'。这个unix命令:
ps aux | grep my_script.php
...会告诉您脚本是否正在运行。您可以在脚本开头使用shell_exec()运行此命令,如果它已在运行,则运行exit()。
这种方法的主要优点是它不会出错,脚本可能会崩溃,让你的标志文件处于让你认为它仍在运行的状态。
答案 3 :(得分:0)
我坚持使用版本号1.它很简单并且可以解决问题。只要你不想检查脚本是否已经完成它就应该足够了。如果要记住更复杂的数据,我会选择版本3,以便能够“记住”相关数据......
HTH
ķ