简介

一个强大的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. Linq多字段排序

    var q = db.Customers.OrderBy(c => c.City).ThenBy(c => c.ContactName).ToList(); var q = from it ...

  2. using namespace cv

    在OpenCV中使用 using namespace cv 的作用: 在使用#include语句包含相应头文件后,使用下面语句即可包含相应的Opencv命名空间 using namespace cv; ...

  3. 分布式理论系列(三)ZAB 协议

    分布式理论系列(三)ZAB 协议 在学习了 Paxos 后,接下来学习 Paxos 在开源软件 Zookeeper 中的应用. 一.Zookeeper Zookeeper 致力于提供一个高性能.高可用 ...

  4. TOGAF架构培训材料学习总结

        作于一个架构师尤其是企业架构师来说,丰富的理论知识可以帮助他在架构规划及管理过程中站在更高的角度去看待问题,历史发展原因有很多已成体系的架构理论,TOGAF是近年来比较接地气的,受到了政府和银 ...

  5. .net二纬码标签打印

    在企业开发中经常用到二纬码标签,本文详细介绍.net环境下整个二纬码解决方案. 开发环境  vs2008  DevExpress8.3  ThoughtWorks.QRCode (二纬码生成组件,高版 ...

  6. 转 org.aspectj.lang.JoinPoint-中文简要API

    AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...

  7. IntricCondition和expliciteCondition比较

    IntricCondition 和 expliciteCondition 的区别 与 intrinsicLoc和expliciteLock的区别很相似, expliciteCondition提供了更多 ...

  8. How to generate HMAC-SHA1 in C#?

    using (HMACSHA1 m = new HMACSHA1(Encoding.UTF8.GetBytes("AKIDZfbOA78asKUYBcXFrJD0a1ICvR98JM&quo ...

  9. WebBrowser控件支持WebSocket

    修改html页面,在Header标签中添加如下标签: <meta http-equiv="X-UA-Compatible"content="IE=edge" ...

  10. JAVA-WEB开发环境和搭建

    JAVA Web开发环境与搭建 一.下载安装JDK 1.配置jdk开发环境 JAVA_HOME 2.path 二.下载安装eclipse javaEE版本 三.安装部署tomcat 3.1.安装: 直 ...