一、安装 php-resque

进入项目根目录,composer 安装 php-resque

composer require chrisboulton/php-resque

二、常用方法

1、连接 redis

// setBackend($server, $database = 0)
Resque::setBackend('127.0.0.1:6379');

2、向队列中添加工作

// enqueue($queue, $class, $args = null, $trackStatus = false)
$token = Resque::enqueue('default', 'My_Job', ['name'=>'test'], true);

3、查看工作状态

$status = (new Resque_Job_Status($token))->get();

4、停止(移除)工作

(new Resque_Job_Status($token))->stop();

三、常驻任务处理队列(示例:worker.php)

// 处理 default 队列;也可以填 *,代表所有队列
$worker = new Resque_Worker('default');
// LOG_NONE 不写日志, LOG_NORMAL 普通,LOG_VERBOSE 详细
$worker->logLevel = Resque_Worker::LOG_VERBOSE;
// 队列处理时间间隔,单位:秒
$worker->work(5);

注:worker.php 要以命令行的方法执行,并长驻后台,/usr/local/php/bin/php /xxx/xxx/worker.php

四、处理工作的类

class My_Job
{
/**
* 前置操作
* @return void
*/
public function setUp()
{
// ... Set up environment for this job
} /**
* 消费队列
* @return void
*/
public function perform()
{
// execute a job
} /**
* 后置操作
* @return void
*/
public function tearDown()
{
// ... Remove environment for this job
}
}

五、完整例子

test.php

<?php
require 'vendor/autoload.php'; /**
* php-resque 队列服务
*/
class Queue
{
private $jobStatusObject = []; function __construct($server, $database = 0)
{
// 连接 redis
Resque::setBackend($server);
} private function getJobStatusObject($token)
{
if (!isset($this->jobStatusObject[$token])) {
$this->jobStatusObject[$token] = new Resque_Job_Status($token);
} return $this->jobStatusObject[$token];
} /**
* 入队并返回 token
* @param array $args 参数
* @return string
*/
public function enqueue($args = [])
{
// 队列名称、指定消费类、参数
return Resque::enqueue('default', 'My_Job', $args, true);
} /**
* 查询 job 的状态
* @param string $token 任务token
* @return array 状态信息
*/
public function getJobStatus($token)
{
$status = $this->getJobStatusObject($token)->get();
$statusOptions = [
1 => 'STATUS_WAITING',
2 => 'STATUS_RUNNING',
3 => 'STATUS_FAILED',
4 => 'STATUS_COMPLETE'
];
return isset($statusOptions[$status])? $statusOptions[$status]:$status;
} /**
* 清除 job
* @param string $token 任务token
* @return boolean 状态信息
*/
public function clearJob($token)
{
if ($this->getJobStatusObject($token) == 'STATUS_COMPLETE')
{
return $this->getJobStatusObject($token)->stop();
}
else
{
error_log("非已完成任务,不可清除。token: {$token}\n", 3, 'logs.txt');
return false;
}
}
} empty($_GET) && die('url参数或数据不能为空!!');
$token = isset($_GET['token'])? trim($_GET['token']):'';
$act = isset($_GET['act'])? trim($_GET['act']):''; $queue = new Queue('127.0.0.1:6379');
if (empty($act))
{
// 任务入队
$token = $queue->enqueue($_GET);
error_log("token: {$token}\n", 3, 'logs.txt');
echo 'token: ', $token, '<hr>';
exit;
}
elseif ($act == 'status' && !empty($token))
{
// 查看任务状态
var_dump($queue->getJobStatus($token));
exit;
}
elseif ($act == 'del' && !empty($token))
{
// 移除任务
var_dump($queue->clearJob($token));
exit;
}
?>

测试url:

http://localhost/redis/queue/test.php?name=test
// token: 37efa5889472ef04108a55ba8cc448e4 http://localhost/redis/queue/test.php?act=status&token=37efa5889472ef04108a55ba8cc448e4
// string(14) "STATUS_WAITING" http://localhost/redis/queue/test.php?act=del&token=37efa5889472ef04108a55ba8cc448e4
// bool(false)

worker.php

<?php
// 消费(处理)队列 require 'vendor/autoload.php'; /**
* 任务
*/
class My_Job
{
/**
* 前置操作
* @return void
*/
public function setUp()
{
// ... Set up environment for this job
} /**
* 消费队列
* @return void
*/
public function perform()
{
// 按自己的业务处理 job
error_log(var_export($this->args, true)."\n\n", 3, 'logs.txt'); // 抛出错误则表示工作处理失败,否则工作状态将更新为完成(STATUS_COMPLETE)
// 注:return false 不管用,一定要 throw Exception 才行
// throw new Exception('Unable to run this job!');
} /**
* 后置操作
* @return void
*/
public function tearDown()
{
// ... Remove environment for this job
}
} // 处理 default 队列;也可以填 *,代表所有队列
$worker = new Resque_Worker('default');
// LOG_NONE 不写日志, LOG_NORMAL 普通,LOG_VERBOSE 详细
$worker->logLevel = Resque_Worker::LOG_VERBOSE;
// 队列处理时间间隔,单位:秒
$worker->work(5);
?>

php-resque 队列简单使用的更多相关文章

  1. 利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构

    题目: 7-1 银行业务队列简单模拟 (30 分)   设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客 ...

  2. Linux 进程间通信(posix消息队列 简单)实例

    Linux 进程间通信(posix消息队列 简单)实例 详情见: http://www.linuxidc.com/Linux/2011-10/44828.htm 编译: gcc -o consumer ...

  3. Laravel5.4 队列简单配置与使用

    概述 什么是队列? 百度百科是这样说的 “队列”是在传输过程中保存数据的容器. 举几个生活中例子: * iphone手机新款发布,三里屯iphone进的新货.大家要排队买,不能说一大堆人一起冲进去,那 ...

  4. redis消息队列简单应用

    消息队列出现的原因 随着互联网的高速发展,门户网站.视频直播.电商领域等web应用中,高并发.大数据已经成为基本的标识.淘宝双11.京东618.各种抢购.秒杀活动.以及12306的春运抢票等,他们这些 ...

  5. 团体队列UVA540 Team Queue(队列简单用法)

    题目背景 队列和优先级队列是大多数计算机科学家都知道的数据结构.但是团队队列却不被人熟知,尽管在生活中经常出现.比如,午餐时间的食堂门口的队列就是一个团队队列.在一个团队队列中,每个元素属于一个团队. ...

  6. 使用java实现阿里云消息队列简单封装

    一.前言 最近公司有使用阿里云消息队列的需求,为了更加方便使用,本人用了几天时间将消息队列封装成api调用方式以方便内部系统的调用,现在已经完成,特此记录其中过程和使用到的相关技术,与君共勉. 现在阿 ...

  7. C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(二)

    上一章我们讲了队列( Queue),这一章我们讲Message Queue消息队列,简称MQ. 定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开 ...

  8. node事件循环和消息队列简单分析

    node的好处毋庸置疑,事件驱动,异步非阻塞I/O,以及处理高并发的能力深入人心,因此大家喜欢用node做一些小型后台服务或者作为中间层和其他服务配合完成一些大型应用场景. 什么是异步? 异步和同步应 ...

  9. django-Celery分布式队列简单使用

    介绍: Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 它是一个专注于实时处理的任务队列,同时也支持任务调度. worker:是一个独立的进程, ...

随机推荐

  1. springboot集成ftp

    目录 springboot集成ftp pom依赖包 ftp登录初始化 ftp上传文件 ftp读取文件,并转成base64 ftp下载文件 ftp客户端与服务端之间数据传输,主动模式和被动模式 spri ...

  2. keller PAA-3XX/80794系列(绝压)压力传感器

    一.瑞士 keller(科勒)压力传感器 keller英文版通讯协议百度网盘:提取码:fusc 广播模式:所有从机都会收到上位机信息 Broadcasting This mode of communi ...

  3. 【HTTP】另类的POST头数据 RFC1867协议格式简析

    http://blog.csdn.net/ai2000ai/article/details/52161979 昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错, ...

  4. .dxf文件

    DXF 是 AutoCAD 与其它软件之间进行 CAD 数据交换的开放矢量数据文件格式,可以分为两类:ASCII 格式和二进制格式:ASCII 具有可读性好的特点,但占用的空间较大:二进制格式则占用的 ...

  5. [GXOI/GZOI2019]旅行者 (最短路)

    题意 给定一个有向图,其中一些顶点为关键点.求这些关键点两两之间最小距离. 题解 考试时没怎么想写了50分暴力走了.以为是什么强连通分量的解法,结果就是个最短路.直接从关键点跑一次最短路dis[0], ...

  6. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

  7. 洛谷 p1968 美元汇率 题解

    传送门 美元由马克转化,马克由美元转化 求最大美元 每一天只有2种选择 ①:不转化另一货币 ②:转化另一货币 典型01背包 可以开一个二维数组f[100][3] F[i][1]表示前i天获得最大美元 ...

  8. ubuntu14.04 安装python3.7

    下载源码:https://www.python.org/downloads/release/python-373/ 一.先安装需要的包zlib1g,libffisudo apt-get update ...

  9. 【Gamma】Scrum Meeting 1 & 与助教谈话

    前言 Gamma阶段第1次会议在5月26日22:00由PM在大运村一公寓三层召开, 时长30min. 任务分配 姓名 今日任务 明日任务 困难 周博闻 用户控制器解耦和注释 用户控制器解耦和注释 周国 ...

  10. C#实现图像拖拽以及锚点缩放功能

    本文主要实现C#窗体图像拖拽以及锚点缩放功能 1.新建Windows窗体应用项目,添加一个panel控件,在panel控件上添加picturebox控件 代码如下: using System; usi ...