fimaruf/recurring-task-scheduler

Laravel 定时任务调度器


README

PHP Laravel 包,提供调度功能。

提供了一个可调度的 trait,允许您将 Eloquent 模型链接到调度模型。

调度器生成一个未来的调度事件记录集合,并有一个命令行任务,该任务在附加对象上执行调度回调。

包安装

composer require croudtech/recurring_task_scheduler

将可调度提供者添加到您的 Laravel 配置文件 app.php 中的 providers 列表

[
    ...
    'providers' => [
        ...
        \CroudTech\RecurringTaskScheduler\RecurringTaskSchedulerServiceProvider::class,
        ...
    ],
    ...
]

可调度的模型必须使用 RecurringTaskSchedulableTrait 并实现 RecurringTaskSchedulableInterface

RecurringTaskSchedulableInterface 接口期望一个 recurringTaskScheduleCallback() 方法,当执行调度时会被调用。

class Task extends Model {
    public function recurringTaskScheduleCallback(\CroudTech\RecurringTaskScheduler\ScheduleEvent $schedule_event) : boolean
    {
        try {
            ...do something here...
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }
}

路由

api/croudtech/schedule/{schedule}

调度对象的 RESTful 资源路由

api/croudtech/schedule/{schedule}/schedule-event/{schedule_event}

调度事件的嵌套资源路由

api/croudtech/schedule/parse

调度解析器。传入一个定义数组以获取匹配的日期。不保存任何数据,因此适用于预览

先决条件

PHP 7 和 Laravel 5.3^

版本控制

SemVer

部署

此包应通过 composer 安装,遵循上述包安装步骤

所有者

Jim Robinson jim.robinson@croud.co.uk

文档

调度定义模式

  • 每天
    • 每 N 天 {period, interval}
    • 每周工作日 {period, interval, modifier}
    • 每周 DOW {period, interval}
  • 每周
    • N 周 {period, interval}
    • 在工作日 DOW {period, interval, modifier}
  • 每月的同一天
    • 每月的第 N 天 {period, interval, modifier}
  • 每月的同一周
  • – 每隔 N 个月在 (1,2,3,4,last) DOW {period, interval, modifier}
  • 每年的同一天
  • – 月份 {period, interval, modifier}
  • 每年的同一周
  • – (1,2,3,4,last) DOW 或 月 {period, interval, modifier}
SELECT Date_format(Now(), '%Y %c %w')
      AS
      current_formatted_day,
      Date_format(Now(), Concat('%Y ', months.month_number, ' ',
                         days.day_number)) AS
      schedule_formatted_day,
      months.month_name,
      months.month_number,
      days.day_name,
      days.day_number,
      schedules.*
FROM   schedules
      INNER JOIN (SELECT id,
                         'January' AS `month_name`,
                         '1'       AS `month_number`
                  FROM   schedules
                  WHERE  `jan` = 1
                  UNION ALL
                  SELECT id,
                         'February' AS `month_name`,
                         '2'        AS `month_number`
                  FROM   schedules
                  WHERE  `feb` = 1
                  UNION ALL
                  SELECT id,
                         'March' AS `month_name`,
                         '3'     AS `month_number`
                  FROM   schedules
                  WHERE  `mar` = 1
                  UNION ALL
                  SELECT id,
                         'April' AS `month_name`,
                         '4'     AS `month_number`
                  FROM   schedules
                  WHERE  `apr` = 1
                  UNION ALL
                  SELECT id,
                         'May' AS `month_name`,
                         '5'   AS `month_number`
                  FROM   schedules
                  WHERE  `may` = 1
                  UNION ALL
                  SELECT id,
                         'June' AS `month_name`,
                         '6'    AS `month_number`
                  FROM   schedules
                  WHERE  `jun` = 1
                  UNION ALL
                  SELECT id,
                         'July' AS `month_name`,
                         '7'    AS `month_number`
                  FROM   schedules
                  WHERE  `jul` = 1
                  UNION ALL
                  SELECT id,
                         'August' AS `month_name`,
                         '8'      AS `month_number`
                  FROM   schedules
                  WHERE  `aug` = 1
                  UNION ALL
                  SELECT id,
                         'September' AS `month_name`,
                         '9'         AS `month_number`
                  FROM   schedules
                  WHERE  `sep` = 1
                  UNION ALL
                  SELECT id,
                         'October' AS `month_name`,
                         '10'      AS `month_number`
                  FROM   schedules
                  WHERE  `oct` = 1
                  UNION ALL
                  SELECT id,
                         'November' AS `month_name`,
                         '11'       AS `month_number`
                  FROM   schedules
                  WHERE  `nov` = 1
                  UNION ALL
                  SELECT id,
                         'December' AS `month_name`,
                         '12'       AS `month_number`
                  FROM   schedules
                  WHERE  `dec` = 1) AS months
              ON months.id = schedules.id
      INNER JOIN (SELECT id,
                         'Sun' `day_name`,
                         '0'   AS `day_number`
                  FROM   schedules
                  WHERE  `sun` = 1
                  UNION ALL
                  SELECT id,
                         'Mon' `day_name`,
                         '1'   AS `day_number`
                  FROM   schedules
                  WHERE  `mon` = 1
                  UNION ALL
                  SELECT id,
                         'Tue' `day_name`,
                         '2'   AS `day_number`
                  FROM   schedules
                  WHERE  `tue` = 1
                  UNION ALL
                  SELECT id,
                         'Wed' `day_name`,
                         '3'   AS `day_number`
                  FROM   schedules
                  WHERE  `wed` = 1
                  UNION ALL
                  SELECT id,
                         'Thu' `day_name`,
                         '4'   AS `day_number`
                  FROM   schedules
                  WHERE  `thu` = 1
                  UNION ALL
                  SELECT id,
                         'Fri' `day_name`,
                         '5'   AS `day_number`
                  FROM   schedules
                  WHERE  `fri` = 1
                  UNION ALL
                  SELECT id,
                         'Sat' `day_name`,
                         '6'   AS `day_number`
                  FROM   schedules
                  WHERE  `sat` = 1) AS days
              ON days.id = schedules.id
WHERE
NOW() BETWEEN schedules.starts_at AND schedules.ends_at
AND Date_format(Now(), '%Y %c %w') = Date_format(Now(),
Concat('%Y ', months.month_number, ' ',
days.day_number))
AND (( schedules.period = 'every'
|| ( `period` = CASE
   WHEN Ceil(Day(
   Str_to_date('2017-07-28',
   '%Y-%m-%d')) / 7) = 1
    THEN
   'first'
   WHEN Ceil(Day(
   Str_to_date('2017-07-28',
   '%Y-%m-%d')) / 7) = 2
    THEN
   'second'
   WHEN Ceil(Day(
   Str_to_date('2017-07-28',
   '%Y-%m-%d')) / 7) = 3
    THEN
   'thrird'
   WHEN Ceil(Day(
   Str_to_date('2017-07-28',
   '%Y-%m-%d')) / 7) = 4
    THEN
   'fourth'
   WHEN Ceil(Day(
   Str_to_date('2017-07-28',
   '%Y-%m-%d')) / 7) = 4
    THEN
   'fifth'
   ELSE 'every'
 end )
 || (schedules.period = 'alternate' AND MOD(DAYOFYEAR(NOW()),2) = MOD(DAYOFYEAR(schedules.starts_at),2)
)))
AND deleted_at IS NULL;