简介

一个强大的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的更多相关文章

  1. TaskScheduler一个.NET版任务调度器

    TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式 ...

  2. 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

    21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...

  3. 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  4. azkaben任务调度器

    azkaban学习笔记总结 01.工作流调度器azkaban 1. 任务调度概述 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive ...

  5. SpringBoot2 task scheduler 定时任务调度器四种方式

    github:https://github.com/chenyingjun/springboot2-task 使用@EnableScheduling方式 @Component @Configurabl ...

  6. Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler

    5. 创建任务调度器TaskScheduler TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度.TaskScheduler也可以看作 ...

  7. C# 可指定并行度任务调度器

    可指定并行度的任务调度器 https://social.msdn.microsoft.com/Forums/zh-CN/b02ba3b4-539b-46b7-af6b-a5ca3a61a309/tas ...

  8. springMVC + quartz实现定时器(任务调度器)

    首先我们要知道任务调度器(定时器)有几种,这边我会写三种 第一种是基于JDK的本身的一个定时器(优点:简单,缺点:满足不了复杂的需求) package com.timer1; import java. ...

  9. 基于Spring Task的定时任务调度器实现

    在很多时候,我们会需要执行一些定时任务 ,Spring团队提供了Spring Task模块对定时任务的调度提供了支持,基于注解式的任务使用也非常方便. 只要跟需要定时执行的方法加上类似 @Schedu ...

随机推荐

  1. SSM整合中每一框架需要做的基本操作简述

    1.dao层的工作 pojo和映射文件以及接口(使用逆向工程) SqlMapConfig.xml(Mybaits核心配置文件) ApplicationContext-dao.xml  整合后Sprin ...

  2. [Laravel] mac下通过 homestead 搭建环境 到运行项目

    seven_Android 关注 2017.07.03 21:33* 字数 2240 阅读 3464评论 10喜欢 9 之前学习过一段时间的 Laravel ,换 mac 后一直没空做相关的事情,而且 ...

  3. Spring JMX之一:使用JMX管理Spring Bean

    spring中关于jmx包括几个概念: MBeanExporter: 从字面上很容易理解, 用来将一些spring的bean作为MBean暴露给MBEanServer.MBeanServerFacto ...

  4. velocity在html中换行符转换

    <td colspan="3" class="tdContent2">$!obj.getDealInfo().replaceAll("\r ...

  5. http头部信息

    1.常见的返回码 100: 请服务器端继续返回 200:成功 301:永久重定向 存的地址永久的改变了  301 302 : 暂时重定向 302仍然使用老得url 401 : 无法找到资源file n ...

  6. tips 移出 消失和 移入 显示

    //规则tipsvar tip_index = 0;$(document).on('mouseenter', '.layui-badge-rim', function(){ tip_index=lay ...

  7. 《Forward团队-爬虫豆瓣top250项目-开发文档》

    码云地址:https://github.com/xyhcq/top250 模块功能:获取豆瓣top250网页的源代码,并分析. def getHTMLText(url,k): # 获取网页源代码 tr ...

  8. SDJZUOJ迷宫问题

    题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行 ...

  9. Oracle EBS 初始化用户密码

    ---修改密码,并且将限制用户下次登录的时候(第一次登录),强制要换一个新的口令: ---此过程可以完全模拟我们在标准用户的Form里面初始化用户的密码的动作!   ---最后要说明的是,这个处理过程 ...

  10. Android-Camera+SurfaceView

    Camera相机是属于硬件,每台设备的Camera硬件配置的参数都是不一样的,Camera通常是用来拍照,扫描二维码等等 AndroidManifest.xml配置Camera需要的权限: <! ...