我绝对不建议为此使用 cronjobs。
cronjobs 是一件好事,非常有用且易于用于许多目的,但是当您描述您的需求时,我认为它们可能会产生更多的复杂性而不是它们的好处。以下是一些需要考虑的事项:
如果工作重叠会发生什么?一个需要比一分钟更长的时间来执行?是否有任何共享资源/死锁/临时文件? - 最常用的方法是使用一个锁文件,如果它在程序开始时被占用就停止执行。但该计划还必须在完成之前寻找更多工作。 - 但是,这在 Windows 机器上也会变得复杂,因为它们 AFAIK 不支持开箱即用的写锁
cronjobs 很难维护。如果要监视它们,则必须实现其他逻辑,例如检查程序上次运行的时间。但是,如果您的程序只应按需运行,这可能会变得很困难。最好的方法是在数据库中添加某种“作业已完成”字段或删除已处理的行。
在大多数基于 unix 的系统上,cronjobs 现在相当稳定,但是有很多情况可以破坏你的 cronjob 系统。其中大多数是基于人为错误。例如,系统管理员未在编辑模式下正确退出 crontab 编辑器可能会导致所有 cronjobs 被删除。由于上述原因,许多公司也没有适当的监控系统,并在他们的服务遇到问题时立即通知。在这一点上,通常没有人写下/将哪些 cronjobs 应该运行并置于版本控制之下,开始疯狂的猜测和重建工作。
当使用外部工具并且环境不是本机 unix 系统时,cronjob 维护可能会更加复杂。系统管理员必须了解更多程序,他们可能会遇到潜在错误。
老实说,我认为从控制台启动并打开一个小脚本就可以了。
<?php
while(true) {
$job = fetch_from_db();
if(!$job) {
sleep(10)
} else {
$job->process();
}
}
您还可以在每个循环中触摸一个文件(修改修改时间戳),并且您可以编写一个 nagios 脚本来检查该时间戳是否过期,以便您知道您的工作仍在运行...
如果你想让它与系统一起启动,我推荐一个守护进程。
ps:在我工作的公司里,我们的网站有很多的后台活动(爬网、更新流程、计算等),当我开始工作时,cronjobs 真是一团糟.它们分布在负责不同任务的不同服务器上。数据库在互联网上被广泛访问。大量的 nfs 文件系统、samba 共享等用于共享资源。这个地方充满了单点故障、瓶颈和不断破裂的东西。涉及的技术太多,维护起来非常困难,当某些东西无法正常工作时,它需要数小时的时间来追踪问题,甚至还要花一个小时的时间来解决该部分应该做的事情。
现在我们有了一个统一的更新程序,它负责几乎所有的事情,它在多台服务器上运行,并且它们有一个配置文件来定义要运行的作业。每一件事都是从一个执行无限循环的父进程中分派的。它易于监控、定制、同步,一切运行顺利。它是多余的,它是同步的并且粒度很好。所以它并行运行,我们可以扩展到任意数量的服务器。
我真的建议坐下来充分考虑所有事情,并全面了解整个系统。然后投入时间和精力来实施一个解决方案,该解决方案将在未来很好地发挥作用,并且不会在您的系统中传播大量不同的程序。
pps:
我读了很多关于 cronjobs/tasks 最小间隔 1/5 分钟的文章。您可以使用接管该间隔的任意脚本轻松解决此问题:
// run every 5 minutes = 300 secs
// desired interval: 30 secs
$runs = 300/30; // be aware that the parent interval needs to be a multiple of the desired interval
for($i=0;$i<$runs;$i++) {
$start = time();
system('myscript.php');
sleep(300/10-time()+$start); // compensate the time that the script needed to run. be aware that you have to implement some logic to deal with cases where the script takes longer to run than your interavl - technique and problem described above
}