[原创]php任务调度器 hellogerard/jobby
简介
一个强大的php层面上的定时任务调度器, 无需修改系统层面的crontab
实际中, php 结合 crontab 来实现定时任务是一种经得住考验的实践, 但每次新增/修改定时任务项时都需要去修改系统的crontab, 这会带来两个麻烦: 一个是繁琐, 一个是难以版本控制.
特点:
- 只需维护一个crontab主作业
- 子作业完全由PHP编写
- 支持标准crontab的调度时间格式
- 作业执行超时时可防止运行多个作业副本
- 作业执行出错退出时发送邮件通知
- 可以其他用户身份执行(若主crontab执行用户具有sudo权限)
- 支持仅在某个主机名上运行
- 理论上的Windows支持(包作者未测试过)
相关链接:
安装
php 5.4
composer require "hellogerard/jobby:3.4.1"
注意版本不要用3.4.1以上的, 会出问题(尽管packagist里3.4.2和3.4.3写着php>=5.4, 但实际会出问题)
php 更高版本
composer require hellogerard/jobby
配置crontab主作业
* * * * * cd /path/to/project && php jobby.php &>/dev/null
使用示例文件
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
// 具体任务
[原创]php任务调度器 hellogerard/jobby的更多相关文章
- TaskScheduler一个.NET版任务调度器
TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式 ...
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...
- 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- azkaben任务调度器
azkaban学习笔记总结 01.工作流调度器azkaban 1. 任务调度概述 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive ...
- SpringBoot2 task scheduler 定时任务调度器四种方式
github:https://github.com/chenyingjun/springboot2-task 使用@EnableScheduling方式 @Component @Configurabl ...
- Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler
5. 创建任务调度器TaskScheduler TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度.TaskScheduler也可以看作 ...
- C# 可指定并行度任务调度器
可指定并行度的任务调度器 https://social.msdn.microsoft.com/Forums/zh-CN/b02ba3b4-539b-46b7-af6b-a5ca3a61a309/tas ...
- springMVC + quartz实现定时器(任务调度器)
首先我们要知道任务调度器(定时器)有几种,这边我会写三种 第一种是基于JDK的本身的一个定时器(优点:简单,缺点:满足不了复杂的需求) package com.timer1; import java. ...
- 基于Spring Task的定时任务调度器实现
在很多时候,我们会需要执行一些定时任务 ,Spring团队提供了Spring Task模块对定时任务的调度提供了支持,基于注解式的任务使用也非常方便. 只要跟需要定时执行的方法加上类似 @Schedu ...
随机推荐
- Linq多字段排序
var q = db.Customers.OrderBy(c => c.City).ThenBy(c => c.ContactName).ToList(); var q = from it ...
- using namespace cv
在OpenCV中使用 using namespace cv 的作用: 在使用#include语句包含相应头文件后,使用下面语句即可包含相应的Opencv命名空间 using namespace cv; ...
- 分布式理论系列(三)ZAB 协议
分布式理论系列(三)ZAB 协议 在学习了 Paxos 后,接下来学习 Paxos 在开源软件 Zookeeper 中的应用. 一.Zookeeper Zookeeper 致力于提供一个高性能.高可用 ...
- TOGAF架构培训材料学习总结
作于一个架构师尤其是企业架构师来说,丰富的理论知识可以帮助他在架构规划及管理过程中站在更高的角度去看待问题,历史发展原因有很多已成体系的架构理论,TOGAF是近年来比较接地气的,受到了政府和银 ...
- .net二纬码标签打印
在企业开发中经常用到二纬码标签,本文详细介绍.net环境下整个二纬码解决方案. 开发环境 vs2008 DevExpress8.3 ThoughtWorks.QRCode (二纬码生成组件,高版 ...
- 转 org.aspectj.lang.JoinPoint-中文简要API
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...
- IntricCondition和expliciteCondition比较
IntricCondition 和 expliciteCondition 的区别 与 intrinsicLoc和expliciteLock的区别很相似, expliciteCondition提供了更多 ...
- How to generate HMAC-SHA1 in C#?
using (HMACSHA1 m = new HMACSHA1(Encoding.UTF8.GetBytes("AKIDZfbOA78asKUYBcXFrJD0a1ICvR98JM&quo ...
- WebBrowser控件支持WebSocket
修改html页面,在Header标签中添加如下标签: <meta http-equiv="X-UA-Compatible"content="IE=edge" ...
- JAVA-WEB开发环境和搭建
JAVA Web开发环境与搭建 一.下载安装JDK 1.配置jdk开发环境 JAVA_HOME 2.path 二.下载安装eclipse javaEE版本 三.安装部署tomcat 3.1.安装: 直 ...