龙空技术网

简单的任务计划与PHP

爱码农 143

前言:

而今我们对“php计划任务系统”大体比较关怀,各位老铁们都需要学习一些“php计划任务系统”的相关资讯。那么小编在网络上搜集了一些关于“php计划任务系统””的相关文章,希望我们能喜欢,大家一起来了解一下吧!

随着一位开发人员解释如何为他使用PHP语言梦想的DevOps团队创建调度工具。

在一个或多或少的大型项目中,当计划任务(cron作业)的数量变得如此之大以至于他们的支持成为DevOps的噩梦时,可能会出现这种情况。为了解决这个问题,我想出了创建PHP调度程序实现的想法,从而使其成为项目的一部分,使任务本身成为其配置的一部分。在这种情况下,必要且足够数量的cron作业将等于1。

前段时间,我开发了一个活动策划模块。它只是该应用程序用户的Google / Apple日历的简化版本。为了存储关于重复事件的日期和规则,决定使用iCalendar格式(RFC 5545),该格式允许一行描述重复事件的时间表,同时考虑一周中的几天,几个月,重复次数等等。几个例子:

FREQ = WEEKLY; BYDAY = SU, WE - Weekly on Saturday and Wednesday

FREQ = MONTHLY; COUNT = 5 - Every month, five times

FREQ = YEARLY; INTERVAL = 2; BYMONTH = 1; BYDAY = SU - Every second year on every

正如你所看到的,这个标准允许我们以比cron更灵活的方式来描述重复事件的规则。

要使用iCalendar格式,我很幸运能够找到一个美妙的图书馆 (不要担心它的明星)。

有一个使用RRULE(重复规则)的工具,应用程序变得更简单。编写几个允许您计划和运行任务的类(这是PHP可调用类型的任何表现形式)。

安装库:

composer require hutnikau / job-scheduler

计划和启动任务:

代表任务的课程是: \Scheduler\Job\Job

要创建它的实例,您需要一个重复规则(RRULE)和一个可调用类型的实例:

$startTime = new \DateTime('2017-12-12 20:00:00');

$rule = new \Scheduler\Job\RRule('FREQ=MONTHLY;COUNT=5', $startTime); //run monthly, at 20:00:00 starting from the 12th of December 2017, 5 times

$job = new \Scheduler\Job\Job($rule, function () {

//do something

});

或者,使用 \Scheduler\Job\ Job:: createFromString ()

$job = \Scheduler\Job\Job::createFromString(

'FREQ=MONTHLY;COUNT=5', //Recurrence rule

'2017-12-28T21:00:00', //Start date

function() {}, //Callback

'Europe/Minsk' //Timezone. If $timezone is omitted, the current timezone will be used

);

不要忘记时区。我强烈建议您始终明确地指定它们(不仅在使用此库时,而且 \DateTime作为一个整体)以避免不愉快的意外。

将任务添加到计划中:

$scheduler = new \Scheduler\Scheduler()

$scheduler->addJob($job);

您还可以将任务数组传递给构造函数:

$scheduler = new \Scheduler\Scheduler([

$job,

//more jobs here

])

现在,启动计划任务:

$jobRunner = new \Scheduler\JobRunner\JobRunner();

$from = new \DateTime('2017-12-12 20:00:00');

$to = new \DateTime('2017-12-12 20:10:00');

$reports = $jobRunner->run($scheduler, $from, $to, true);

在此示例中,将执行为指定时间段(10分钟)计划的所有任务。

所以你只需要一个运行的cron作业 JobRunner

您可以省略 $ 参数,以便从$当前时间开始执行所有任务 。

最后一个参数确定任务是否完成,其执行时间恰好落在边界值(示例中的'2017-12-12 20:00:00'和'2017-12-12 20:10:00')以上)。

当用cron启动调度程序时,我建议你保存最后一次运行的时间,并在下一次运行它时,通过$增加一秒将它传递给 参数,因为cron的准确性并不完美,并且有可能跳过任何任务或执行两次。$ jobRunner-> run (...)返回已完成任务的结果数组(类型的对象数组\Scheduler\Action\Report)。

\Scheduler\Action\Report {

/* Methods */

public mixed getReport ( void )

public Action getAction ( void )

public string getType ( void )

}

通过调用\Scheduler\Action\Report:: getReport (),您可以获得执行可调用的结果(由其返回的值)。

如果在执行任务期间抛出异常,则 \Scheduler\Action\Report:: getReport ()返回相同的异常。

该方法 \Scheduler\Action\Report:: getAction ()将返回一个\Scheduler\Action\ActionInterface描述所采取行动的类型实例 。通过使用它,你可以找出行动的时间或获得行动本身。

还值得注意的是,如果一个计划任务必须被执行多次(例如,如果RRULE中使用了MINUTELY间隔,并且$ from和$ to之间的差值在JobRunner中传输10分钟),那么该操作将会多次执行。换句话说,他们不会被分组。

图书馆非常小,但我希望有人会有用。

标签: #php计划任务系统