您的位置:首页 > 数据库 > Redis

php使用redis作为消息队列

2016-10-14 10:26 681 查看

安装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开机启动


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

使用list作为redis队列

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

入队脚本

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

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


出队脚本

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

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

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


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

php实现

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


crontab实现

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


使用subscribe/publish方式作为队列

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

发布脚本

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

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


订阅脚本

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

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

handler.php

$redis->subscribe(array($channel), 'handleFun');
function handleFun($redis, $chan, $msg) {
$params = json_decode($msg,true);
....
}


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

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

nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&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


crontab -e
*/1 * * * * /var/www/monitor.sh
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: