Redis+php-resque实现消息队列
服务器硬件配置
Dell PowerEdge R310英特尔单路机架式服务器
- Intel Xeon Processor X3430 2.4GHz, 8MB Cache
- 8GB内存(2 x 4GB), 1333MHz, 双列RDIMMs用1于处理器配置
- 2TB近线3.5英寸7.2K RPM 6Gbps SAS硬盘 - 非热插拔
- SAS 6/iR 控制卡
- 8倍速SATA超薄DVD-ROM光驱
- 非冗余电源,
350W
软件环境
- CentOS 6.2 minimal
- Nginx 1.2.7
- PHP 5.3.17
- MySQL 5.5.28-log
- Redis 2.6.16
一、Redis安装
1. 获取源码
shell>#
cd /usr/local/src
shell># wget http://download.redis.io/releases/redis-2.6.16.tar.gz
shell># tar -zxvf redis-2.6.16.tar.gz
shell># cd redis-2.6.16
2. 编译、安装
shell>#
make
3. 配置Redis
编辑redis.conf文件
shell>#
vi /usr/local/src/redis-2.6.16/redis.conf
daemonize
= yes
4. 启动Redis
shell>#
src/redis-server
/usr/local/src/redis-2.6.16/redis.conf
5. 测试连接
shell>#
src/redis-cli
redis>
set foo bar
OK
redis>
get foo
“bar”
redis>
exit;
二、phpredis 安装
1. 获取源码
shell>#
cd /usr/local/src
shell># wget https://github.com/nicolasff/phpredis/archive/2.2.3.tar.gz -O
nicolasff-phpredis-2.2.3.tar.gz
shell># tar -zxvf nicolasff-phpredis-2.2.3.tar.gz
shell># cd phpredis-2.2.3
2. 编译、安装
shell>#
/usr/local/php/bin/phpize
shell>#
./configure –-with-php-config=/usr/local/php/bin/php-config
shell># make &&
make install
3. 配置php.ini
shell>#
vi
/usr/local/php/etc/php.ini
extension=redis.so
4. 重启nginx & php-fpm
三、php-resque安装
*准备工作
需要pcntl支持
安装git
shell>#
yum -y install git
安装Composer
shell>#
cd
/usr/local/bin
shell># curl
–sS https://getcomposer.org/installer
| php
shell># mv composer.phpar
/usr/local/bin/composer
修改 php.ini
disable_functions = … …
将proc_open和proc_get_status以及exec删除
保存后,重启LNMP
1. 获取源码
shell>#
cd /home/wwwroot/default
shell># git
clone git://github.com/chrisboulton/php-resque.git
2. 安装
shell>#
cd php-resque
shell># composer install
四、Demo
1. 一个Job
Job|任务:一个Job就是一个需要在后台完成的任务,比如邮件发送,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
shell># cd php-resque
shell># vim
demo/job.php
<?php
class PHP_Job
{
public function perform()
{
fwrite(STDOUT, 'Start job! -> ');
sleep(10);
fwrite(STDOUT, 'Job ended!' .
PHP_EOL);
}
}
这个Job的具体任务:输出’Start job! ->’,然后等待10秒钟后,再次输出’Job ended!’。
在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法。
2. 将Job插入队列
Queue|队列:就是标题中的消息队列。在Resque中,队列由Redis来负责实现。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
shell>#
vim
demo/queue.php
<?php
if(empty($argv[1]) or empty($argv[2]))
{
die('Specify the name of a queue or job
to add. e.g, php queue.php default
PHP_Job');
//在cli命令行中运行queue.php 后面必须加上两个参数,第一个参数为queue的名称 第二个参数为job的名称,必须同之前编写的Job类的类名。
}
require __DIR__ .
'/init.php';
date_default_timezone_set('GMT');
Resque::setBackend('127.0.0.1:6379');
$args = array(
'time' => time(),
'array' => array(
'test' => 'test',
),
);
$jobId =
Resque::enqueue($argv[1], $argv[2], $args, true);
echo "Queued job
".$jobId."\n\n";
在cli方式中运行:
shell>#
php
demo/queue.php default PHP_Job
结果可以在屏幕上看到输出:
Queued
job 4ee7cefcb7df03ff5475fd450e2a5bea
即Job添加入队列成功。
3. 查看Job运行情况
php-resque同样提供了查看Job运行状态的例子,直接运行:
shell>#
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
我们刚才创建的Job运行状态为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; (结束)
由于没有运行Worker,所以刚才创建的Job还是等待状态。
4. 运行Worker
shell>#
vim demo/resque.php
<?php
date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';
可以看到一个Worker至少需要两部分:
1.可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载。
2.包含Resque中默认的Worker: bin/resque
在cli方式下运行:
shell>#
QUEUE=default
php demo/resque.php
前面的QUEUE部分是设置的环境变量,我们指定当前的Worker只负责处理default队列。也可以使用
shell>#
QUEUE=* php
demo/resque.php
来处理所有的队列。
运行后,可以看到输出:
[notice] Starting worker
s3:19060:default
[notice] Starting work on
(Job{default} | ID: 4ee7cefcb7df03ff5475fd450e2a5bea | PHP_Job |
[{"time":1378073476,"array":{"test":"test"}}])
Start job! -> Job ended! //Job的运行结果
[notice] (Job{default} | ID:
4ee7cefcb7df03ff5475fd450e2a5bea | PHP_Job |
[{"time":1378073476,"array":{"test":"test"}}])
has finished
使用ps指令检查一下:
shell># ps aux | grep
resque
可以看到有一个php的守护进程已经在运行了
root 19060
0.0 0.6 209680 11768 pts/0 S+
06:12 0:01 php demo/resque.php
任务运行完毕后,同时屏幕可以看到输出结果!
至此利用Redis + php-resque实现消息队列的演示全部完成。
5. 参考资料
http://avnpc.com/pages/run-background-task-by-php-resque
http://kamisama.me/2012/10/09/background-jobs-with-php-and-resque-part-1-introduction/
Redis+php-resque实现消息队列的更多相关文章
- (七)整合 Redis集群 ,实现消息队列场景
整合 Redis集群 ,实现消息队列场景 1.Redis集群简介 1.1 RedisCluster概念 2.SpringBoot整合Redis集群 2.1 核心依赖 2.2 核心配置 2.3 参数渲染 ...
- Redis学习笔记~实现消息队列比MSMQ更方便
什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队的顺序依次 ...
- Redis实现简单的消息队列
1.问:什么是消息队列? 答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...
- redis分布式锁和消息队列
最近博主在看redis的时候发现了两种redis使用方式,与之前redis作为缓存不同,利用的是redis可设置key的有效时间和redis的BRPOP命令. 分布式锁 由于目前一些编程语言,如PHP ...
- Redis与RabbitMQ作为消息队列的比较
简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.消息中间 ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
- SpringBoot2.0 整合 Redis集群 ,实现消息队列场景
本文源码:GitHub·点这里 || GitEE·点这里 一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的 ...
- 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消息队列,而不想引入新的服务,kafk ...
- redis实现有序的消息队列
redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
随机推荐
- poj_2421_mst
D - Constructing Roads Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- JAVA NIO中selectedKeys返回的键集,对其中的SelectionKey执行操作之后,是否需要在selectedKeys()中对其执行remove 操作
今天一个东西需要用到java nio的东西.在网上查了一下资料,发现有Apache的Mina,Netty等,感觉JDK中带的NIO有点鸡肋啊.之前看过这部分的内容,但好长一段时间没有用,也就忘得七七八 ...
- SaveFileDialog的用法
#region 保存对话框 private void ShowSaveFileDialog() { //string localFilePath, fileNameExt, newFileName, ...
- JAVA toString方法
在JAVA中,所有的对象都有toString方法: 创建类时没有定义toString方法,输出对象时,会输出对象的哈希值: 它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个 ...
- 【jQuery】关于选择器中的 :first 、 :first-child 、 :first-of-type
[:first] <!DOCTYPE html><html lang="zh-CN"><head> <title>test&l ...
- Gerrit清单库配置(转载)
From:http://fatalove.iteye.com/blog/1340334 gerrit清单库是用来配合repo使用的.清单库中列出了gerrit服务器上的其他版本库. 客户端通过repo ...
- jdk之jhat命令
jhat命令 -- JavaHeap Analyse Tool 用途:是用来分析Java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言第一步:导出堆 ...
- C++学习23 虚函数详解
虚函数对于多态具有决定性的作用,有虚函数才能构成多态.上节的例子中,你可能还未发现虚函数的用途,不妨来看下面的代码. #include <iostream> using namespace ...
- ACM—最大连续子序列(HDOJ1003)
HDOJ链接 http://acm.hdu.edu.cn/showproblem.php?pid=1003 不了解题目的朋友可以先看一下题目,在这里就不再详细介绍了.(文章内容和解题思路不完全相同,方 ...
- Appium技术点之解决屏幕无法点击的情况————Python版本
1.导入包: from appium.webdriver.common.touch_action import TouchAction 2.写代码 TouchAction(driver).pop(x= ...