php任务调度器,[原创]php任务调度器 hellogerard/jobby

本文介绍了一个PHP层面的高效定时任务调度器Jobby,它允许在无需修改系统CRON的情况下,通过PHP编写任务,支持标准CRON时间格式,提供错误通知和版本控制等功能,极大地提升了定时任务的管理和维护效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

一个强大的php层面上的定时任务调度器, 无需修改系统层面的crontabgit

实际中, php 结合 crontab 来实现定时任务是一种经得住考验的实践, 但每次新增/修改定时任务项时都须要去修改系统的crontab, 这会带来两个麻烦: 一个是繁琐, 一个是难以版本控制.github

特色:shell

只需维护一个crontab主做业

子做业彻底由PHP编写

支持标准crontab的调度时间格式

做业执行超时时可防止运行多个做业副本

做业执行出错退出时发送邮件通知

能够其余用户身份执行(若主crontab执行用户具备sudo权限)

支持仅在某个主机名上运行

理论上的Windows支持(包做者未测试过)

相关连接:服务器

https://packagist.org/packages/hellogerard/jobby

https://github.com/jobbyphp/jobby

安装

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

// 服务器列表, 实际是从其余地方读取的

$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

// 环境配置

// ...

$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

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

// 具体任务

jobs/minute_stats.php

// 具体任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值