偶然发现了这个gearman,觉得这玩意儿挺好用,非常适合PHP运行一部分业务。

话不多说,安装一下。

使用apt查找

sudo apt search gearman

找到了这个

gearman/bionic,bionic 1.1.18+ds-1 all
Distributed job queue

好,开始安装

sudo apt-get install gearman

好,安装完成,然后查看是否运行

ps -ef |grep gearman

发现有在运行

$ ps -ef |grep gearman
gearman 1660 1 0 02:54 ? 00:00:00 /usr/sbin/gearmand --pid-file=/run/gearman/gearmand.pid --listen=localhost --daemon --log-file=/var/log/gearman-job-server/gearmand.log
vagrant 2310 1452 0 02:54 pts/0 00:00:00 grep --color=auto gearman

好,然后开始安装php的扩展(因为我PHP版本是7.4 所以这里直接查7.4的对应版本扩展了)

$ sudo apt search php7.4-gearman
Sorting... Done
Full Text Search... Done
php7.4-gearman/bionic 2.1.0+1.1.2-5+ubuntu18.04.1+deb.sury.org+1 amd64
PHP wrapper to libgearman

然后开始安装这个扩展

sudo apt-get install php7.4-gearman

安装完毕使用php -m过滤一下看看有没有启用

$ php -m |grep gearman
gearman

发现好了,然后开始建两个文件

add_job.php

<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
$res1 = $client->doBackground('runLaterJob', json_encode(array(
'uid' => 'test user id',
'title' => '添加一个需要延时处异步执行的代码标题',
'body' => '执行这个异步的具体内容',
'sleep_time' => 2,
)));

再创建一个 work_job.php

<?php
$worker = new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('runLaterJob', function($job) {
$data = json_decode($job->workload(), true);
if (isset($data['sleep_time']) && $data['sleep_time'] > 0) {
sleep($data['sleep_time']);//如果需要延时 就延时处理
}
echo "处理任务 uid:{$data['uid']}--title:{$data['title']}--body:{$data['body']} 成功\n";
});
//死循环等待job提交的任务
while($worker->work());

启动 work_job.php

php work_job.php

屏幕无任何输出,再启动 add_job.php

php add_job.php

然后 add_job.php 迅速跑完了,然后看到 work_job.php 2秒后有输出

处理任务 uid:test user id--title:添加一个需要延时处异步执行的代码标题--body:执行这个异步的具体内容 成功

这里我们可以看到,添加job的人投递任务完毕后可以立刻干别的事情,由work消费job的人来慢慢的处理业务,这就非常适合用来处理那种订单延时关闭的处理业务。

比如说,创建订单后20分钟内不支付则自动释放库存,那么就可以在创建订单的时候投递这样一个job,然后后续的由消费job在设定的20分钟后来处理订单,决定它是否需要释放库存(如果需要支付了就不操作任何动作,如果还没支付,就取消库存,并把订单设置为过期未支付订单)

以往我们在处理这种业务类型的时候用的是crontab来定时查哪些订单需要被关闭,哪些订单需要被释放库存,但这样高度依赖了crontab设定的执行时间的频率,总不能设定为1分钟跑一次吧?如果设定为10分钟一次,比如我们设定为08:00,08:10,08:20等等,就会出现8:00刚跑完定时任务后就下单的用户,他的订单创建时间是08:01,那么对于它而言,08:21分它才应该被关闭,可这个时候08:20的定时任务已经跑完了,那么这个订单就在08:30的定时任务被扫到,等于说它实际上等待了29分钟,这就有了一定程度上的不合理。

而使用这个任务分发,就可以让它的任务在后台躺着被自动处理就可以了。

gearman实现任务分发的更多相关文章

  1. php使用gearman进行任务分发

    一.安装gearman 下载gearman源码包 1 https://launchpad.net/gearmand/+download 如: gearmand-1.1.12.tar.gz 下载php的 ...

  2. 分布式任务分发框架Gearman教程和PHP实现实例

    1.Gearman介绍和使用场景 Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完 ...

  3. 分布式的任务分发框架-Gearman

    官方文档:http://gearman.org/getting-started/ 安装方法和示例都有,可以详细看一下. Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,G ...

  4. Gearman 安装使用教程

    Gearman是一个分发任务的程序框架,可以用在各种场合,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成. Gearman 分布式任务实现原理上只用到2个字段 ...

  5. 分布式任务系统gearman的python实战

    Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统.Gearman是一个分发任务的程序框架,可以 ...

  6. Gearman的使用

    对于分布式网络环境或者有大量任务的应用,我们需要将任务在不同的服务器之间进行分布,这个时候正好是Gearman发挥实力的时候.虽然我们也可以使用MQ队列再加一些自己实现的调度算法来将任务进行分发,但是 ...

  7. linux 下 php 安装 Gearman

    Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.   一个Gearman请求的处理过程涉及三个角色: Clien ...

  8. 利用gearman同步mysql数据到redis

    一.Gearman 1.Gearman是一个分发任务的程序框架. 2.体系:a.client:发送一个jobb.server:找到合适的worker,把job交给该workerc.worker:处理j ...

  9. Gearman 初窥【转载】

    Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于Live ...

  10. gearman的安装与使用

    Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.php官方收录:http://php.net/manual/zh ...

随机推荐

  1. TOML 使用

    TOML Reference TOML Tom's Obvious, Minimal Language TOML 被设计成可以无歧义地映射为哈希表.(相当于 JSON 对象吧) 注释 # 这是一个全行 ...

  2. Xmind 8思维导图(含补丁)

    Xmind 8思维导图(含补丁) 什么是思维导图? 如何下载Xmind8 Xmind 8软件简单使用 获取Xmind 8 补丁 什么是思维导图? 数据结构.电路模拟等学习路线,老师都有叫画思维导图,那 ...

  3. Blazor开发框架Known-V2.0.10

    Known今天迎来了2.0的第11个版本,同时网站网址和板块也进行了一次升级改造,虽不完美,但一直在努力改变,之前一直在完善框架功能,忽略了文档的重要性,所以这次更新了文档和API.交流互动板块也在进 ...

  4. CF228E 题解

    CF228E 题解 题目简述 给定一个 \(n\) 个点,\(m\) 条边的无向图,每条边都为 \(0\) 或 \(1\),可以进行若干次操作,与此点相连的所有点权值取反,求一种方案使得所有边都变为 ...

  5. Spring —— 整合MyBatis

    MyBatis核心程序      配置文件    整合MyBatis      

  6. vue本地项目启动时遇到coreJs相关报错问题处理

    启动项目的时候报错 : 是因为core.js这个包丢失,需要大家重新下载即可 : yarn add core-js

  7. 74.数组map能干什么,会改变原数组吗

    map是处理数据的方法,不会改变原数组,会返回一个新数组 : filter 也不会改变原数组,会返回新数组 : forEach 也不会改变原数组,不会返回新数组 : reduce不会改变原数组 : 是 ...

  8. 15 Transformer 框架概述

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  9. springboot admin 整合nacos,context-path问题

    1.在使用springboot admin 整合nacos时发现问题,springboot admin server访问admin client的默认地址为http://ip:port/actuato ...

  10. day02-json字符串和js对象

    Web1.0时代 早期网站的登录,如果失败,需要刷新页面才能重新登录; 如果不点击提交按钮,就不知道自己密码输错了: 现在大多数的网站,都是局部刷新,在不刷新整个页面的情况下,实现页面更新: 注册的时 ...