【问题标题】:What should I use for simple cron jobs management in PHP project?我应该在 PHP 项目中使用什么来进行简单的 cron 作业管理?
【发布时间】:2011-06-24 07:49:13
【问题描述】:

我想在 PHP 项目中进行类似 cron 的简单管理 有一些我想要的东西:

  1. php job worker 只是简单的脚本,放置在项目目录的某个子目录中
  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 项目可用的解决方案?基本上它只是一些更智能的运行部件等价物。还是写一遍吧?

附:还有更多特定于作业队列的解决方案,例如 Gearman。他们很棒,但是这个问题是关于项目 cron 作业的轻量级解决方案。

【问题讨论】:

  • 在谷歌上搜索“pseudo-cron”,有很多免费的脚本可供修改。但总的来说,我会自己写;我以前做过,不难。
  • 谢谢,pseudo-cron 是有趣的东西,但不是很方便:作业根本不是 cron 作业,可能会错过计划,你应该编写 pseudo-crontab。至于难度——是的,没那么难,实际上我只是有一种感觉,我可能不知道一些很好的解决方案,我要重新发明和重写
  • 对下面给出的答案有何回应?

标签: php cron scheduling crontab scheduler


【解决方案1】:

在我目前的工作中,我们采取了稍微不同的方法。我们使用Jenkins(以前称为 Hudson)来满足我们与 PHP 相关的调度需求。这很好,因为您可以利用现有的基础设施进行通知(jabber、电子邮件等),并且它与我们的其他代码发布构建作业并列。还可以实时查看控制台输出、获取每次运行的成绩单等。

我最近记录了我们组织 PHP 作业的方式,以便我们可以从 CLI 轻松利用我们的应用程序框架,这就是 Jenkins 与作业交互的方式。

这是关于组织 PHP 批处理作业以供 Jenkins 或 Hudson 使用的帖子:

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

【讨论】:

    【解决方案2】:

    Periodic is a CRON compatible task manager 用 PHP 编写。为了让它像你想要的那样工作,还有一些工作要做,但它应该给你一个很好的基础。

    【讨论】:

    【解决方案3】:

    使用此功能:

    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,看看底部的两个例子
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多