smichaelsen / php-cron-scheduler
PHP Cron作业调度器
Requires
- php: >=5.5.9
- mtdowling/cron-expression: @stable
- swiftmailer/swiftmailer: @stable
Requires (Dev)
- phpunit/phpunit: 5.0.*
README
这是一个简单的cron作业调度器,灵感来自Laravel任务调度。
通过Composer安装
推荐的方式是通过Composer安装php-cron-scheduler。
请参阅入门指南了解如何下载和安装Composer。
下载/安装Composer后,运行
php composer.phar require peppeocchi/php-cron-scheduler
或添加包到您的composer.json
{ "require": { "peppeocchi/php-cron-scheduler": "1.*" } }
工作原理
您不必为每个要运行的cron作业在crontab中添加新条目,只需将一个cron作业添加到您的crontab中,并在您的.php文件中定义命令即可。
默认情况下,当您安排一个命令时,它将在后台运行,您可以通过调用->runInForeground()
方法来覆盖此行为。
$scheduler->call('myFunction')->runInForeground()->every()->minute();
应将输出发送到电子邮件的作业始终设置为在前景运行
创建您的scheduler.php
文件如下所示
<?php require_once __DIR__.'/../vendor/autoload.php'; use GO\Scheduler; function myFunc() { return "Hello world from function!"; } $scheduler = new Scheduler([ 'emailFrom' => 'myemail@address.from' ]); /** * Schedule cronjob.php to run every minute * */ $scheduler->php(__DIR__.'/cronjob.php')->at('* * * * *')->output(__DIR__.'/cronjob.log'); /** * Schedule a php job to run with your bin * */ $scheduler->php(__DIR__.'/cronjob.php')->useBin('/usr/bin/php')->at('* * * * *')->output(__DIR__.'/cronjob_bin.log', true); /** * Schedule a raw command to tun every minute between 00 and 04 of every hour, * send the output to raw.log * Pass `true` as a second parameter to append the output to that file * */ $scheduler->raw('ps aux | grep httpd')->at('* * * * *')->output(__DIR__.'/raw.log', true); /** * Run your own function every day at 10:30 * */ $scheduler->call('myFunc')->every()->day('10:30')->output(__DIR__.'/call.log'); $scheduler->call(function () { return "This works the same way"; })->at('* * * * *')->output(__DIR__.'/call.log'); /** * Run only when your func returns true * */ $scheduler->php(__DIR__.'/cronjob.php') ->at('* * * * *') ->when(function () { return false; })->output(__DIR__.'/never_created.log'); /** * Send the output to an email address * */ $scheduler->call(function () { return "This will be sent via email"; })->at('* * * * *')->output(__DIR__.'/call.log')->email('myemail@address.to'); $scheduler->run();
然后将它添加到您的crontab中
* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
您就可以开始了。
配置
您可以将一个包含全局作业配置的数组传递给Scheduler构造函数
目前唯一支持的配置是发送作业执行结果时的发送者电子邮件地址
... $config = [ 'emailFrom' => 'myEmail@address.com' ]; $scheduler = new Scheduler($config); ...
作业执行顺序
应运行的作业按其执行顺序排序:可以在后台运行的作业将首先执行
作业类型
创建一个新的Scheduler
实例后,您可以添加几种类型的作业
->php('myCommand')
,执行一个PHP
作业。如果需要,您可以设置自己的PHP_BINARY
$scheduler->php('myCommand')->useBin('myBin')
->raw('myCommand')
,在shell中执行原始命令,如果您想执行多个命令,如ps aux | grep memcached
,可以使用此类型->call('myFunction')
,执行您自己的函数- 您可以编写自己的解释器(如果您想,可以为此仓库添加解释器),只需扩展
GO\Job\Job
并定义build()
方法,以及一个可选的init()
,如果它需要在运行命令之前进行初始化(例如,定义bin路径)
输出
您可以将cron作业的执行输出发送到文件和电子邮件地址。
->output('myfile')
将覆盖该文件(如果存在)->output('myfile', true)
将附加到该文件(如果存在)如果您想将输出发送到电子邮件地址,您需要首先将输出发送到文件。该文件将附加到电子邮件中->output('myfile')->email('myemail')
如果您想将输出发送到多个文件/电子邮件,可以传递文件或电子邮件的数组 ->output(['first_file', 'second_file'])->email(['myemail1' => 'Dev1', 'myemail2' => 'Dev2'])
条件
您可以将cron作业的执行委托给一个真实的测试。
$scheduler->raw('command')->when(function () {
.....
return true;
});
调度时间
Scheduler
使用Cron\CronExpression
作为表达式解析器。
您可以使用->at('myCronExpression')
方法来安排任务,并将cron表达式(例如* * * * *
)或由mtdowling/cron-expression支持的任何表达式传递给它。
您还可以选择使用“优雅的排程”,允许您以优雅的方式定义时间。为此,您应该调用->every()
后跟
->minute()
,任务将被安排每分钟运行一次->hour('02')
任务将被安排每小时运行一次。默认minute
为00
,但您可以用自己的minute
来覆盖它(在示例中,它将在每小时的02
分钟运行)->day('10:23')
任务将被安排每天运行一次。默认的hour:minute
是00:00
,但您可以用自己的hour:minute
来覆盖它->month('25 10:30')
任务将被安排每月运行一次。默认的day hour:minute
是01 00:00
,但您可以用自己的day hour:minute
来覆盖它