一个强大的php层面上的定时任务调度器, 无需修改系统层面的crontabgit
实际中, php 结合 crontab 来实现定时任务是一种经得住考验的实践, 但每次新增/修改定时任务项时都须要去修改系统的crontab, 这会带来两个麻烦: 一个是繁琐, 一个是难以版本控制.github
特色:shell
相关连接:服务器
php 5.4闭包
composer require "hellogerard/jobby:3.4.1"
注意版本不要用3.4.1以上的, 会出问题(尽管packagist里3.4.2和3.4.3写着php>=5.4, 但实际会出问题)composer
php 更高版本测试
composer require hellogerard/jobby
配置crontab主做业ui
* * * * * cd /path/to/project && php jobby.php &>/dev/null
使用示例文件this
cp vendor/hellogerard/jobby/resources/jobby.php .
// 加载composer autoload require_once __DIR__ . '/vendor/autoload.php'; // 建立Jobby实例 $jobby = new Jobby\Jobby(); // 每一个job都有一个惟一名称 $jobby->add('CommandExample', [ // 运行一个shell命令 'command' => 'ls', // 运行一个闭包(与 'command' 互斥) //'closure' => function() { // echo "I'm a function!\n"; // return true; //}, // 支持通用调度配置 'schedule' => '0 * * * *', // 可以使用日期时间字符串 //'schedule' => '2017-05-03 17:15:00', // 使用闭包返回boolean来肯定是否执行 //'schedule' => function(DateTimeImmutable $now) { // // Run on even minutes // return $now->format('i') % 2 === 0; //}, // 标准输出/标准错误会写入到指定日志文件 'output' => 'logs/command.log', // 临时关闭某个任务 'enabled' => false, ]); $jobby->run();
每一个任务的必须选项
Key | Type | Description |
---|---|---|
schedule | string | Crontab schedule format (man -s 5 crontab ) or DateTime format (Y-m-d H:i:s ) or callable (function(): Bool { /* ... */ } ) |
command | string | The shell command to run (exclusive-or with closure ) |
closure | Closure | The anonymous PHP function to run (exclusive-or with command ) |
如下的选项列表可应用于单个任务或全局任务(经过传入 Jobby
构造器).
全局选项将会做为每一个任务的默认配置, 单个任务可覆盖全局选项.
Option | Type | Default | Description |
---|---|---|---|
runAs | string | null | Run as this user, if crontab user has sudo privileges |
debug | boolean | false | Send jobby internal messages to 'debug.log' |
Filtering 过滤 | Options to determine whether the job should run or not | ||
environment | string | null or getenv('APPLICATION_ENV') |
Development environment for this job |
runOnHost | string | gethostname() |
Run jobs only on this hostname |
maxRuntime | integer | null | Maximum execution time for this job (in seconds) |
enabled | boolean | true | Run this job at scheduled times |
haltDir | string | null | A job will not run if this directory contains a file bearing the job's name |
Logging 日志 | Options for logging | ||
output | string | /dev/null | Redirect stdout and stderr to this file |
output_stdout | string | value from output option |
Redirect stdout to this file |
output_stderr | string | value from output option |
Redirect stderr to this file |
dateFormat | string | Y-m-d H:i:s | Format for dates on jobby log messages |
Mailing 邮件 | Options for emailing errors | ||
recipients | string | null | Comma-separated string of email addresses |
mailer | string | sendmail | Email method: sendmail or smtp or mail |
smtpHost | string | null | SMTP host, if mailer is smtp |
smtpPort | integer | 25 | SMTP port, if mailer is smtp |
smtpUsername | string | null | SMTP user, if mailer is smtp |
smtpPassword | string | null | SMTP password, if mailer is smtp |
smtpSecurity | string | null | SMTP security option: ssl or tls, if mailer is smtp |
smtpSender | string | jobby@
|
The sender and from addresses used in SMTP notices |
smtpSenderName | string | Jobby | The name used in the from field for SMTP messages |
项目存在多个不一样游戏服, 且每一个服使用的配置文件不同, 所以执行定时任务时需对每一个服单独执行, 特建立crontab.php 文件用于针对不一样服分别调用 jobby.php
crontab配置
* * * * * cd /path/to/project && php crontab.php &>/dev/null
crontab.php
<?php // 服务器列表, 实际是从其余地方读取的 $servers = ["s1", "s2", "s3", "s4"]; foreach ($servers as $server) { $cmd = sprintf("php jobby.php %s &>/dev/null &", $server); exec($cmd); var_dump(compact('cmd')); }
jobby.php
<?php // 环境配置 // ... $server = $argv[1]; $cmdPrefix = "php dispatcher.php $server "; $jobby = new \Jobby\Jobby([ 'output' => "具体的日志输出文件路径", ]); $jobs = require("jobby_config.php"); foreach ($jobs as $name => $job) { if (isset($config['command'])) { $config['command'] = $cmdPrefix.$config['command']; } $jobby->add($name, $job); } $jobby->run();
jobby_config.php
<?php return [ "check_index" => [ 'command' => "month_check_index", 'schedule' => '30 5 1 * *', 'maxRuntime' => 600, ], 'minute_stats' => [ 'command' => "minute_stats", 'schedule' => '* * * * *', 'maxRuntime' => 300, 'enabled' => true, ], ];
dispatcher.php 加载具体服的具体环境, 并调用实际要运行的php定时任务代码
$server = $argv[1]; $command = $argv[2]; // 加载具体服的环境配置 // ... // 执行具体定时任务代码(此处忽略异常处理) require __DIR__ . DIRECTORY_SEPARATOR . "jobs" . DIRECTORY_SEPARATOR . $command . ".php";
jobs/month_check_index.php
<?php // 具体任务
jobs/minute_stats.php
<?php // 具体任务