Zan Job Server

1. 简介

JobWorker是依赖Zan框架的一个单机任务作业的Package;

通过构造request与response对象, 伪造Http请求流程执行以下三种作业任务;

cron: 周期性作业

mqworker: NSQ消息队列实时作业

cli: 命令行一次性作业

2. 快速开始

1. 配置composer.json, 加入 php-lib/job-server 依赖, 参考

2. 配置 ServerStart 与 WorkerStart, 参考

./init/ServerStart/.config.php

use Zan\Framework\Components\JobServer\ServerStart\InitializeJobServerConfig;

return [

InitializeJobServerConfig::class,

];

./init/WorkerStart/.config.php

use Zan\Framework\Components\JobServer\WorkerStart\InitializeJobServer;

use Zan\Framework\Components\Nsq\InitializeSQS;

return [

// !!! 注意配置顺序, SQS要优先JobServer初始化

InitializeSQS::class,

InitializeJobServer::class,

];

3. 加入作业, 参考

作业任务放置根路径 src/Controller

作业类需要继承JobController, cron,mqworker,cli三种作业模式下通用;

需要在方法结尾或异常处 调用 yield $this->jobDone() 或 yield $this->jobError()方法来标注作业执行结果;

可以不主动调用 yield $this->jobDone(), 但是仍需要返回 Response对象

jobController示例:

class TaskController extends JobController

{

public function product()

{

try {

yield doSomething();

yield $this->jobDone();

} catch (\Exception $ex) {

yield $this->jobError($ex);

}

}

}

4. 配置作业, 参考

配置路径结构

config/share/cron/

foo/

cron1.php

cron2.php

bar/

cron3.php

cron4.php

config/share/mqworker/

foo/

mqw1.php

mqw2.php

bar/

mqw3.php

mqw4.php

cron配置说明

crontab 格式, 细节参考crontab, 注意字段允许值不同;

* * * * * *

sec min hour day/month month day/week

0-59 0-59 0-23 1-31 1-12 0-6

秒 值从 0 到 59

分钟 值从 0 到 59

小时 值从 0 到 23

日 值从 1 到 31

月 值从 1 到 12

星期 值从 0 到 6, 0 代表星期日

与php~date()~fmt对应关系:

http://php.net/manual/en/function.date.php

sSeconds, with leading zeros 0 through 59 intval(00 through 59)

iMinutes with leading zeros 0 to 59 intval(00 to 59)

G24-hour format of an hour without leading zeros 0 through 23

jDay of the month without leading zeros 1 to 31

nNumeric representation of a month, without leading zeros1 through 12

wNumeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday)

date format : s i G j n w

其他语法:

* 全部覆盖

- 范围 from-to

/ 步进 /step

时间范围可以用连字符给出,多个时间范围可以用逗号隔开。

星号可以作为通配符。

空格用来分开字段。

除号可以用作指定每隔一段时间执行一次。

以秒为例, 其他位置逻辑相同

每秒执行一次

* * * * * *

每10秒执行一次

*/10 * * * * *

每分钟的第1,15,20,50秒执行

1,15,20,50 * * * * *

每分钟的1-30秒,每三秒执行一次

1-30/3 * * * * *

每分钟的1-30秒,每三秒执行一次,且第50秒,55秒各执行一次

1-30/3,50,55 * * * * *

下面一行将会指定任务在夏天(六、七、八月)之外的每周周一到周五的上午 9 点到下午 4 点之间每 5 分钟执行一次任务。

* */5 9-16 * 1-5,9-12 1-5

在工作日的每天早上 8 点执行

"* 0 8 * * 1-5"

cron配置示例

return [

"作业标识" => [

"uri" => "job/task/taks1", // 必填, 作业uri, 匹配http请求路由

"cron" => "* * * * * *", // 必填, 精确到秒的cron表达式 (秒 分 时 天 月 天(周))

"timeout"=> 60000, // 选填, 默认60000, 执行超时

"method" => "GET", // 选填, 默认GET, 对应http请求

"header" => [ "x-foo: bar", ], // 选填, 默认[], 对应http请求

"body" => "", // 选填, 默认"", 对应http请求

"strict" => false, // 选填, 默认false, 是否启用严格模式, 严格模式会对服务重启等原因错过的任务进行补偿执行

],

"cronJob2" => [

"uri" => "job/task/task0",

"cron" => "* * * * * *",

],

"cronJob3" => [

"uri" => "job/task/taks2?kdt_id=1", // 传递GET参数

"cron" => "*/2 * * * * *",

// POST 传递post参数

"method" => "POST",

"header" => [['Content-type' => 'application/x-www-form-urlencoded']],

"body" => "foo=bar",

],

"cronJob4" => [

"uri" => "job/task/task3?kdt_id=1",

"cron" => "*/2 * * * * *",

"method" => "POST",

"header" => [['Content-type' => 'application/json']],

"body" => "{\"foo\": \"bar\"}",

],

];

mqworker配置示例:

return [

"mqJob1" => [

"uri" => "job/task/consume", // 必填, 作业uri, 匹配http请求路由

"topic" => "taskTopic", // 必填, nsq topic

"channel" => "ch2", // 必填, nsq channel

"timeout"=> 60000, // 选填, 默认60000, 执行超时

"coroutine_num" => 1, // 选填, 默认1, 单个worker任务处理并发数量, 根据业务需要调整

"method" => "GET", // 选填, 默认GET, 对应http请求

"header" => [ "x-foo: bar", ], // 选填, 默认[], 对应http请求

"body" => "", // 选填, 默认"", 对应http请求

],

"mqJob2" => [

"uri" => "job/task/taks2",

"topic" => "someTopic",

"channel" => "ch1",

],

];

5. 启动, 参考

在bin目录新建一个启动脚本, 配置环境变量;

通过环境变量标注当前JobServer模式, 逗号分隔, 目前支持三种模式; 例子:

ZAN_JOB_MODE=cron,mqworker,cli

注: 通过命令行执行Job, 将不会启动MqWorker与CronWorker

示例:

#!/usr/bin/env php

// 此处添加三种任务模式

putenv("ZAN_JOB_MODE=cron,mqworker,cli");

/* @var $app \Zan\Framework\Foundation\Application */

$app = require_once __DIR__.'/../init/app.php';

// 可选创建HttpServer或者TcpServer

$server = $app->createHttpServer();

// $server = $app->createTcpServer();

$server->start();

其他

1. CronWorker

保证每个cron作业绑定到某个具体Worker;

当前cron作业失败不会重试;

Cron表达式parse参考

1. https://git.busybox.net/busybox/tree/miscutils/crond.c?h=1_25_stable

2. http://crontab.org/

3. man 5 crontab

2. MqWorker

使用之前先@冬瓜在nsq中添加topic

使用mqworker,需要配置nsq, lookupd

config/env/nsq.php

return [

"lookup" => [

"http://nsq-dev.s.qima-inc.com:4161",

// "http://sqs-qa.s.qima-inc.com:4161"

]

];

每个worker开n个coroutine, 每个coroutine维持一个到mq的长连接, 在onReceive的回调中构造http请求执行作业;

需要在作业方法结尾或异常处 调用$this->jobDone() 或 $this->jobError() 方法来标注任务执行结果;

手动 yield $this->jobError() 或者 调用任务失败之后, 会自动延时重试,

最多重试5次, 每次延时 2 ** 重试次数秒((2s -> 4s -> 8s -> 16s -> 32s))

3. CliWorker

通过 命令行参数构造http请求,执行作业;

ZAN_JOB_MODE环境变量含有cli, 且加入命令行参数, 默认启动cliworker

./ [-H -X -d -t] uri

-t --timeout 60000 timeout ms

-H --header header 支持多个

-X --request request method

-d --data request body

e.g.

./jobWorker --help

./jobWorker -H "Content-type: application/x-www-form-urlencoded" -X POST --data "foo=bar" -t 10000 job/task/product?kdt_id=1

./jobWorker -H "Content-type: Content-type: application/json" -X POST --data '{"foo": "bar"}' -t 5000 job/task/product?kdt_id=2

php job框架,GitHub - zanphp/job-server相关推荐

  1. Hexo框架+Github Page搭建博客(附下载主题、导出CSDN博客至Hexo博客)

    文章目录 一.Git的下载与安装 二.Nodejs安装 三.安装Hexo 四.初始化Hexo 4.1 hexo init 4.2 配置_config.yml 4.3 hexo s运行 4.4 下载更多 ...

  2. android 半浮层框架,GitHub - Jodragon/AnyLayer: Android稳定高效的浮层创建管理框架

    AnyLayer Android稳定高效的浮层创建管理框架. 可取代系统自带Dialog/Popup/BottomSheet等弹窗,可实现单Activity架构的Toast提示,可定制任意样式的Gui ...

  3. php 后端 轻量 框架,GitHub - 22cloud/mixphp: 轻量 PHP 框架,基于 Swoole 的常驻内存型 PHP 高性能框架 (开发文档完善)...

    高性能 • 轻量级 • 命令行 MixPHP 是什么 MixPHP 秉承 "普及 PHP 常驻内存型解决方案,促进 PHP 往更后端发展" 的理念而创造,采用 Swoole 扩展作 ...

  4. android视频压缩框架,GitHub - tangpeng/VideoCompressor: Android 使用自带的MediaCodec 框架进行本地视频压缩,速度嗖嗖的,亲测有效!!!...

    如果您觉得本项目对你有用,请随手star,谢谢 Android 视频压缩常见3种方案:(1)FFmpeg,(2)mp4praser,(3)MediaCodec. 本demo是用android 自带的M ...

  5. linux进程状态是PD,GitHub - linuxep/lepd: server daemon of LEP

    lepd server daemon of LEP LepD是什么 LEP的结构采用的是Client/Server的模型, Client端是Django+Web服务器,负责显示从Server端取得的数 ...

  6. php ecos框架,GitHub - shopex/luban-desktop: A PHP Framework For Luban Web Artisans

    Shopex luban-desktop使用说明 luban-desktop是商派在Laravel 5.4的基础上开发的一款现代化的框架,其重构了商派原有ECOS框架的实用功能,可以极大的提高项目开发 ...

  7. php后端mvc框架,GitHub - Tokyo-Lei/Amaya: 史上最简单的PHP MVC框架!首先你了解MVC和COMPOSER就行!...

    Amaya PHP Framework 基于Composer完成的MVC框架,自从有了依赖变成史上最最最简单的MVC! 此框架依赖第三方库: Medoo 数据库 twig 模版引擎 whoops 调式 ...

  8. 把Github用作Pypi Server

    因为觉得有参考价值,一直打开许多页面没有关闭,浏览器的 tab 都差不多上百了,决心把一些有意义的内容通过翻译.摘录和重编的形式把核心内容快速统一到博客上来,方便后续检索,也好关掉一些浏览器窗口. 本 ...

  9. Android框架——github上开源代码

    以下是小海收集的常用Github上比较优秀的项目,希望对大家日常开发有所帮助. 在此感谢小海做出的贡献!!! Type LibDescription   LibLocation Android     ...

最新文章

  1. 百度API地图 ,房产频道的标注方法
  2. python_0基础开始_day05
  3. redis smembersmap_Redis数据类型及常用API
  4. 工厂模式的python实现
  5. resteasy经验谈
  6. 论文浅尝 - ICLR2020 | 知识图谱中数值规则的可微学习
  7. 图灵登上英国50英镑新钞,AI之父荣耀比肩英国女王
  8. 微软推出 Xbox 漏洞奖励计划,最高奖励2万美元
  9. Android BlueDroid(一):BlueDroid概述
  10. python中0o10_Python中最常见的10个问题(列表)
  11. Android两种存储用户临时数据的方式比较:Preferences Bundle
  12. mac sudo: /etc/sudoers is world writable
  13. 试图速成的RPG Maker MV 学习笔记(三)
  14. Hive窗口函数之preceding and following
  15. sqlserver日期减一天_第二人立减1000 | 去厦门吃的地道精彩不重样,没有比这更“惠”吃了!...
  16. 法国计算机高等工程师学院排名,法国人工智能专业大学排名(2020年USNEWS)_快飞留学...
  17. 要成为鸿蒙开发者,应该学习哪些编程语言
  18. toooomuch和toooomuch2的wp
  19. 电脑点击关机之后一直退回进入登录界面
  20. 【笔记】嵌入式C语言随堂笔记

热门文章

  1. 【python】结巴分词案例(英文词组识别)
  2. 接口文档————Apidoc的使用
  3. 惊呼!一枚程序缓,竟能开发出如此劲爆的僵尸游戏!
  4. 电商支付平台支付安全保障措施
  5. 在python中读取和写入CSV文件(你真的会吗?)
  6. 穷人翻身远不是钱的事
  7. 机器学习(周志华) 第十章降维与度量学习
  8. IFE阶段二学习总结
  9. pick定理及其证明
  10. 伽马(Gamma)校正的原理及opencv实现