一:简介

github地址:https://github.com/chrisboulton/php-resque

这个轻量级队列是由 Ruby 开发的 Resque 启发而来的。
注意:
1. php-resque需要用到pcntl,所以它全部是在linux下操作的。
2. 它使用的队列是redis

二:php-resque中后台角色划分

实际就是对于这个队列中各个要执行的任务的一个抽象,抽象出几个部分
1)任务 job
一个job就是一个需要在后台完成的任务。比如发送邮件,发送短等等。
在php-resque中就可以把一个job抽象为一个Class

2)队列 queue
也就是消息队列,我们把需要执行的任务Job加入到队列里。在php-resque中,队列是由redis实现的。php-resque提供了一个队列管理器,可以实现将job插入, 移除队列的功能

3)执行者 worker
就是从队列中取出任务来执行,可以以守护进程的方式运行

创建上面3个角色的步骤:
1:将一个后台任务编写为独立的class,这个class就是一个job
2:在需要后台程序地方把job class的名称和所需要的参数加入队列
3:开启worker,通过参数执行worker需要处理的队列
4:worker作为守护进程运行,定时检查队列
说明:在Resque中,还有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度

三:安装

1)可以用composer安装,十分方便。
composer require chrisboulton/php-resque

2)另外一种
先mkdir phpresque, 进入到目录,
编写一个 composer.json
{
"require":{
"chrisboulton/php-resque": "1.2.x"
}
}

然后: composer update
就可以安装好了

四:使用的命令和方法

可以参照 chrisboulton/php-resque/demo 下面的文件
1) 启动守护队列
QUEUE=default VVERBOSE=1 php demo/resque.php

QUEUE部分是设置环境变量,我们指定当前的Worker只负责处理default队列。也可以使用QUEUE=* php demo/resque.php 来处理所有队列

* QUEUE: 需要执行的队列的名字
* INTERVAL:在队列中循环的间隔时间,即完成一个任务后的等待时间,默认是5秒
* APP_INCLUDE:需要自动载入 PHP 文件路径,Worker 需要知道你的 Job 的位置并载入 Job
* COUNT:需要创建的 Worker 的数量。所有的 Worker 都具有相同的属性。默认是创建1个Worker
* REDIS_BACKEND:Redis 服务器的地址,使用 hostname:port 的格式,如 127.0.0.1:6379,或 localhost:6379。默认是 localhost:6379
* REDIS_BACKEND_DB:使用的 Redis 数据库的名称,默认是 0
* VERBOSE:啰嗦模式,设置 1 为启用,会输出基本的调试信息
* VVERBOSE:设置“1”启用更啰嗦模式,会输出详细的调试信息
* PREFIX:前缀。在 Redis 数据库中为队列的 KEY 添加前缀,以方便多个 Worker 运行在同一个Redis 数据库中方便区分。默认为空
* PIDFILE:手动指定 PID 文件的位置,适用于单 Worker 运行方式
* 以上参数中只有QUEUE是必须的。如果让 Worker 监视执行多个队列,可以用逗号隔开多个队列的名称,如:queue1,queue2,queue3,队列执行是有顺序的,如上 queue2 和 queue3 总是会在 queue1 后面被执行。
* 也可以设置QUEUE为*让 Worker 以字母顺序执行所有的队列

2) 结束进程
kill -QUIT YOUR-WORKER-PID

* QUIT - 等待子进程结束后再结束
* TERM / INT - 立即结束子进程并退出
* USR1 - 立即结束子进程,但不退出
* USR2 - 暂停Worker,不会再执行新任务
* CONT - 继续运行Worker

3)示例一个比较完整命令

nohup QUEUE=notification VVERBOSE=1 INTERVAL=10 COUNT=5 APP_INCLUDE=/usr/local/html/bin/loader.php REDIS_BACKENT=127.0.0.1:6379 php /usb/local/html/bin/daemo_queue.php >> /var/log/phpresque.log 2>&1 &

4) 一些其他方法
在源代码中的demo文件夹下有一个 check_status.php 的文件, 这个可以查看job运行的状态
命令:php demo/check_status.php 4ee7cefcb7df03ff5475fd450e2a5bea
输出:
可以看到输出:
Tracking status of 10de5352387ba7212bc0d4e8975a3523. Press [break] to stop.
Status of 4ee7cefcb7df03ff5475fd450e2a5bea is: 1
Status of 4ee7cefcb7df03ff5475fd450e2a5bea is: 1
Status of 4ee7cefcb7df03ff5475fd450e2a5bea is: 1

在Resque中,一个Job有以下4中状态:

Resque_Job_Status::STATUS_WAITING = 1; (等待)
Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)
Resque_Job_Status::STATUS_FAILED = 3; (失败)
Resque_Job_Status::STATUS_COMPLETE = 4; (结束)

* 移除Jobs

#Removes multiple jobs
Resque::dequeue('default');
Resque::dequeue('default', ['My_Job']);
Resque::dequeue('default', ['My_Job' => '087df5819a790ac666c9608e2234b21e']);
Resque::dequeue('default', ['My_Job' => array('foo' => 1, 'bar' => 2)]);
Resque::dequeue('default', ['My_Job', 'My_Job2']); 移除多个jobs

* 消费者可以有三个方法 worker

public function setUp() {} // .. Set up environment for this job
public function perform() {} // .. Run job
public function tearDown() {} // ... Remove environment for this job

* 生产者

Resque::setBackend('127.0.0.1:6379');
$args = array(
'time' => time(),
'array' => array(
'test' => 'test',
),
); $jobId = Resque::enqueue('default', $argv[1], $args, true);

$argv[1]为调用的类, $args 为参数
第一个参数表示消息队列的名称(可随意标记,比如 email,log等),
第二个参数表示取出任务后,由My_Job这个类来处理此条任务

总结:
1.开启守护队列 QUEUE=* php resque.php >> /var/log/phpresque.log &
2.调用job,把job增加到队列里,命令: php queue.php class_Job 参数

然后守护程序就会执行worker PHP_Job->perform()
在 tail -f /var/log/phpresque.log 可以看到执行的结果

五:动手写一个demo实例

1)先安装php-resque
mkdir phpresque
进入到目录,
编写一个 composer.json 的文件,内容如下

{
"require":{
"chrisboulton/php-resque": "1.2.x"
}
}

然后 compose update 安装

2)文件目录,如下图

2.1 新建job,queue,worker3个php文件
a. 先建立一个 job的文件夹,存放要运行的job
b. 然后建立一个Queue.php文件,把要运行的任务加入到队列中
c. 最后是建立Resque.php文件,后台一直运行执行任务的文件,daemon方式运行

2.2 编写程序
job目录下的DemoJob.php

<?php
class DemoJob {
public function perform()
{
$id = $this->args['id'];
$msg = $this->args['msg'];
fwrite(STDOUT, 'DemoJob: id: '.$id.' msg: '.$msg);
}
}
?>

Queue.php文件

<?php
require_once dirname(__FILE__).'/vendor/chrisboulton/php-resque/lib/Resque.php'; class Queue {
public static $queue_name;
public static $job_name;
public static $args; //参数 public static function addqueue($queue_name = 'default', $job_name='', $args)
{
if (empty($job_name)) return false; self::$queue_name = $queue_name;
self::$job_name = $job_name;
self::$args = $args; date_default_timezone_set("Asia/Shanghai");
Resque::setBackend('127.0.0.1:6379'); $job_id = Resque::enqueue($queue_name, $job_name, $args, true);
return $job_id;
}
} $id = 'demo_id:1';
$msg = 'this is test msg';
//第一个参数:队列名称 第二个参数:job的类名称 第三个参数:传入的参数
$job_id = Queue::addqueue('default', 'DemoJob', ['id'=>$id, 'msg'=>$msg]);
echo $job_id;
?>

Resque.php文件:

<?php
//Worker 常驻内存程序
date_default_timezone_set("Asia/Shanghai"); spl_autoload_register(function($class_name){
require_once dirname(__FILE__).'/job/'.$class_name.'.php';
}); require_once dirname(__FILE__).'/vendor/chrisboulton/php-resque/lib/Resque.php';
require_once dirname(__FILE__).'/vendor/chrisboulton/php-resque/lib/Resque/Worker.php'; $QUEUE = getenv('QUEUE');
if (empty($QUEUE)) {
die('set QUEUE env');
} Resque::setBackend('127.0.0.1:6379');
require_once dirname(__FILE__).'/vendor/chrisboulton/php-resque/resque.php';
echo "Done";
?>

2.3 运行脚本
a. 首先运行 Resque.php 脚本,便于查看效果,就不以daemon的方式运行了

[root@centos phpresque]# QUEUE=default /usr/local/php/bin/php Resque.php
*** Starting worker centos:3996:default
DemoJob: id: demo_id:1 msg: this is test msg

b. 把任务加入到队列里

[root@centos phpresque]# /usr/local/php/bin/php Queue.php
8d9c402d3c621d764242dd8f2335f28e # job id

a上面马上就会出现
DemoJob: id: demo_id:1 msg: this is test msg
的信息
说明job运行成功了

参考:
https://blog.csdn.net/maquealone/article/details/75333349
https://blog.csdn.net/u012129607/article/details/78560482

php-resque 轻量级队列的更多相关文章

  1. 轻量级队列beanstalkd

    一.基本Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Face ...

  2. redis resque消息队列

    Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...

  3. PHP memcache实现消息队列实例

    现在,memcache于server缓存广泛应用.下面我来介绍一下memcache消息队列中等待的样本实现,有需要了解的朋友可以参考. memche消息队列原则key上做文章.后消息或者日志. 然后通 ...

  4. 揭开Redis的神秘面纱

    本篇博文将为你解开Redis的神秘面纱,通过阅读本篇博文你将了解到以下内容: 什么是Redis? 为什么选择 Redis? 什么场景下用Redis? Redis 支持哪些语言? Redis下载 Red ...

  5. java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况

    java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况 邮件短信微服务 spring boot 微服务 接收json格式参数 验证参数合 ...

  6. MongoDB资料大全

    摘要: 为了帮助大家进一步了解MongoDB,云栖社区组织翻译了GitHub Awesome MongoDB 资源,涵盖MongoDB中常见的库与工具.应用列表.以及相关的文档.教程等资源. Mong ...

  7. Web应用中的轻量级消息队列

    Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚 ...

  8. 转:基于HTTP协议的轻量级开源简单队列服务:HTTPSQS

    [文章作者:张宴 本文版本:v1.7.1 最后修改:2011.11.04 转载请注明原文链接:http://blog.zyan.cc/httpsqs/] HTTPSQS(HTTP Simple Que ...

  9. 一个高性能、轻量级的分布式内存队列系统--beanstalk

    Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Mem ...

随机推荐

  1. Winform实现多线程异步更新UI(进度及状态信息)

    引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数 ...

  2. Nginx 多核cpu负载均衡

    L:122 查看Linux CPU 缓存大小 cat /sys/devices/system/cpu/cpu1/cache/index0/size //指令缓存 cat /sys/devices/sy ...

  3. 【算法】串的模式匹配算法(KMP)

    串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在 ...

  4. BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set

    题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...

  5. Codeforces Round #445 Div. 1

    A:每次看是否有能走回去的房间,显然最多只会存在一个,如果有走过去即可,否则开辟新房间并记录访问时间. #include<iostream> #include<cstdio> ...

  6. 数据库 -- mysql记录操作

    一,概括 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...

  7. Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot

    题意:给出一段操作序列 和目的地 问修改(只可以更改 不可以删除或添加)该序列使得最后到达终点时  所进行的修改代价最小是多少 其中代价的定义是  终点序号-起点序号-1 思路:因为代价是终点序号减去 ...

  8. 继承&派生 属性查找

    # 在单继承背景下,无论是新式类还是经典类属性查找顺序都一样 # 先object->类->父类->... 实例: class Foo: def f1(self): print('Fo ...

  9. 【NOI2003——搜索+二分图匹配优化】

    A 文本编辑器 无旋treap真好看 B 木棒游戏 暴力神仙题 C 数据生成器 树的直径两端点为Y, Z D 智破连环阵 搜索+二分图匹配优化 第一次写欸 列一下 void dfs (int y,in ...

  10. Apache Ignite上的TensorFlow

    任何深度学习都是从数据开始的,这是关键点.没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要.在做研究.构建新的神经网络架构.以及做实验时,会习惯于使用最简单的本地数据 ...