php使用redis作为消息队列

4 篇文章 0 订阅

安装redis

redis不在centos官方源里面,需要手动下载EPEL(Extra Packages for Enterprise Linux)进行安装。
EPEL相当于是原来源的扩展,具体的介绍可以看下这两篇文章

http://blog.chinaunix.net/uid-2469966-id-3916408.html

http://f.dataguru.cn/thread-47927-1-1.html

注意,我们去http://fedoraproject.org/wiki/EPEL这个网站找安装文件的时候,应该跟你的系统版本一致,比如说我用的centos7,我下载的地址。

https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm

rpm -ivh epel-release-6-8.noarch.rpm    #安装epel扩展
yum -y install redis        #安装redis
yum install php-redis       #安装php扩展
service redis start         #启动redis服务器
chkconfig redis on          #设置redis开机启动
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

php-redis扩展手册地址:https://github.com/phpredis/phpredis#connect-open

使用list作为redis队列

list在redis中是一个双向队列,我们可以从队列的左边入队,从队列的右边出队。这样就可以实现先来先服务的队列操作。

入队脚本

每当收到服务器请求时,将待处理的信息,从list的左边插入。

$params = json_encode($_REQUEST);
$redis->Lpush($key,$params);
  
  
  • 1
  • 2

出队脚本

编写脚本,通过crontab定时执行脚本,从list的右边取出错误处理。

这种方式的优点是不会出现数据的丢失,只有定时脚本处理完相关信息之后,才从队列中取出;缺点也是显而易见的,响应不够及时,因为是定时访问redis的list队形,所以不能实时的处理队列中的消息。

$params = $redis->Rpop($key);
  
  
  • 1

定时从队列中取出信息,可以采用php脚本sleep的方式,也可以使用crontab实现。

php实现

while(true){
    sleep(1);    //每秒执行一次
    handle($params = $redis->Rpop($key));
}
  
  
  • 1
  • 2
  • 3
  • 4

crontab实现

* * * * * sleep 20; /usr/bin/php /var/www/html/handler.php #20s执行一次
*/1 * * * * /usr/bin/php /var/www/html/handler.php #每分钟执行一次
  
  
  • 1
  • 2

使用subscribe/publish方式作为队列

在redis中,我们支持一种发布订阅机制,就像无线电广播一样。A订阅了一个频道之后,如果B在该频道发布了消息之后,A就能收听到。

发布脚本

每当收到服务器请求时,将待处理的信息,发布到对应频道。

$params = json_encode($_REQUEST);
$redis->publish($channel,$params);
  
  
  • 1
  • 2

订阅脚本

编写脚本,在linux后台一直执行,实时监听该频道广播的消息。

这种方式的优点是可以实时的处理数据,并且是redis主动向php脚本推送消息;缺点是有可能会有数据的丢失,因为消息的发布是实时性的,该发布/订阅通道不保存消息,仅仅作为消息传递的渠道,如果消息没有被订阅的脚本捕捉到,则会导致数据的丢失。

handler.php

$redis->subscribe(array($channel), 'handleFun');
function handleFun($redis, $chan, $msg) {
    $params = json_decode($msg,true);
    ....
} 
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

上面的数据处理脚本handler.php,一直在后台运行。

我们可以使用下面命令在后台执行

nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
  
  
  • 1

我们为了防止脚本意外终止(发生错误等情况)不再工作,我们写一个定时任务监控该脚本的执行情况。

monitor.sh

#!/bin/bash
alive=`ps aux|grep \/usr\/bin\/php|grep -v grep|wc -l`
if [ $alive -eq 0 ]
then
nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
fi
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
crontab -e
*/1 * * * * /var/www/monitor.sh
  
  
  • 1
  • 2
原文:http://blog.csdn.net/koastal/article/details/52813669
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值