在PHP项目中,我应该使用什么来管理简单的cron作业?

5
我希望在 PHP 项目中实现一个简单的类似 cron 的管理系统,以下是我的一些要求:
  1. php 作业工作者只是普通的脚本,放置在项目目录的某个子目录中。
  2. 在项目根目录下有诸如 /cron/daily、/cron/monthly 等子目录,包含了所有的工作者。
  3. 不需要为每个工作者都添加 crontab。
  4. 所有脚本都由类似于 run-parts 的程序以相应的频率运行,并将它们各自的输出记录在单独的文件中,例如 /var/log/projectname/cron/daily/somescript.log。
  5. 最好有一个 /cron/daemon 目录,包含应该永久运行(每分钟运行一次)但不超过 1 个实例的脚本。
我在一个项目中使用过这种调度系统,并且很喜欢它。它提供了许多方便的功能:
  • 作业是项目脚本,位于项目目录中,由 git 跟踪。
  • 无需修改 crontab。
  • 日志已分类。
  • 守护进程易于构建。
我想只需在项目 /cron 子目录上使用 /bin/run-parts,但无法按照我想要的方式分割日志。分割日志是非常好的功能,所以我想这种系统已经被创建了很多次,是否有 PHP 项目的现成解决方案?基本上只需要一个更智能的 run-parts 等效程序。应该再写一遍吗?
附注:还有许多特定于作业队列的解决方案,如 Gearman。它们很棒,但这个问题是关于项目 cron 作业轻量级解决方案的。

在谷歌上搜索“伪cron”,有很多免费的脚本可以进行调整。但总的来说,我会自己编写;我以前做过,而且并不难。 - Benubird
谢谢,伪cron是有趣的东西,但它们并不是非常方便:任务根本不是cron任务,计划可能会被错过,而且你还需要编写伪crontab。至于难度——是的,实际上并不那么困难,我只是感觉自己可能不知道一些很棒的解决方案,所以要重新发明和重写。 - evgenyq
以下给出的答案有任何回应吗? - tobyS
3个回答

2
我们在我目前的工作中采用了略微不同的方法。我们使用 Jenkins(以前是Hudson)来满足我们PHP相关的调度需求。这很好,因为您可以利用现有基础设施进行通知(jabber,电子邮件等),它与我们发布代码的其他构建作业并排存在。还可以实时监视控制台输出,获取每次运行的记录等。
最近,我记录了我们组织PHP作业的方式,以便我们可以轻松地从CLI利用我们的应用程序框架,这是Jenkins与作业接口的方式。
以下是有关组织PHP批处理作业以供Jenkins或Hudson使用的帖子:

http://blog.shupp.org/2011/03/15/organizing-php-batch-jobs/


0

看起来这家名为Arbit的公司已经消失了。 - Richard
你仍然可以在Github上找到Periodic源代码 https://github.com/Arbitracker/Periodic。 - tobyS

-1
请使用这个函数:
function parse_crontab($time, $crontab)
         {$time=explode(' ', date('i G j n w', strtotime($time)));
          $crontab=explode(' ', $crontab);
          foreach ($crontab as $k=>&$v)
                  {$v=explode(',', $v);
                   foreach ($v as &$v1)
                           {$v1=preg_replace(array('/^\*$/', '/^\d+$/', '/^(\d+)\-(\d+)$/', '/^\*\/(\d+)$/'),
                                            array('true', $time[$k].'===\0', '(\1<='.$time[$k].' and '.$time[$k].'<=\2)', $time[$k].'%\1===0'),
                                            $v1
                                           );
                           }
                   $v='('.implode(' or ', $v).')';
                  }
          $crontab=implode(' and ', $crontab);
          return eval('return '.$crontab.';');
         }
var_export(parse_crontab('2011-05-04 02:08:03', '*/2,3-5,9 2 3-5 */2 *'));
var_export(parse_crontab('2011-05-04 02:08:03', '*/8 */2 */4 */5 *'));

$time和$crontab是什么? - Bhargav Nanekalva
@Bhargav,请看底部的两个示例。 - diyism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接