热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpjob框架,GitHubzanphp/jobserver

ZanJobServer1.简介JobWorker是依赖Zan框架的一个单机任务作业的Package;通过构造request与response对象,伪造Http请求流程执行以下三种

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



推荐阅读
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文探讨了在Lumen框架中实现自定义表单验证功能的方法与挑战。Lumen的表单验证机制默认返回无状态的JSON格式API响应,这给初学者带来了一定的难度。通过深入研究Validate类,作者分享了如何有效配置和使用自定义验证规则,以提升表单数据的准确性和安全性。 ... [详细]
  • 在Linux系统中,原本已安装了多个版本的Python 2,并且还安装了Anaconda,其中包含了Python 3。本文详细介绍了如何通过配置环境变量,使系统默认使用指定版本的Python,以便在不同版本之间轻松切换。此外,文章还提供了具体的实践步骤和注意事项,帮助用户高效地管理和使用不同版本的Python环境。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
  • 在Laravel中实现PHP对JSON数据的发布与处理 ... [详细]
  • Mongoose E11000 错误:集合中出现重复键问题分析与解决 ... [详细]
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 随着越来越多的应用程序采用JSON格式作为响应数据,基于Spring Framework构建的服务端应用也广泛采用了这一实践。本文将详细介绍如何在Spring 4.x版本的MVC框架中配置和实现HTTP请求返回JSON数据流,涵盖相关配置、依赖管理和代码示例,帮助开发者高效地实现这一功能。 ... [详细]
  • 利用宝塔面板高效部署与使用Easyswoole框架详解
    本文详细介绍了如何在宝塔面板上高效部署和使用Easyswoole框架。以PHP 7.4和宝塔面板7.6为环境基础,首先配置了Swoole扩展,并禁用了`symlink`、`readlink`和`proc_open`三个潜在风险函数。接着,通过宝塔面板的便捷管理功能,顺利完成了Easyswoole框架的安装与初步配置,为开发者提供了高效、稳定的开发环境。 ... [详细]
  • 如何迅速识别并解决Gradle项目中的Jar包名称冲突问题?
    在处理Gradle项目时,经常会遇到Jar包名称冲突的问题。本文介绍了如何快速识别并解决此类冲突,特别是在使用fastjson的Feature.OrderedField功能时。通过添加特定参数,可以有效避免JSON字段乱序的情况,确保数据的一致性和可靠性。此外,文章还提供了详细的步骤和示例代码,帮助开发者高效地解决Jar包冲突问题。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • $apply() 方法允许从 AngularJS 框架外部触发表达式的执行,确保其在 AngularJS 的上下文中运行。例如,当你使用 `setTimeout()` 或者集成第三方库时,可以通过调用 `$apply()` 来确保事件更新能够被 AngularJS 检测到并触发脏检查机制,从而实现数据的双向绑定。这一过程不仅保证了数据的一致性,还提升了应用的响应速度和用户体验。 ... [详细]
author-avatar
前年老妖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有