前言:
而今我们对“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计划任务系统