Fork me on GitHub
代码改变世界

消息列队 php 基于redis 实现

2017-11-28 10:09  freefei  阅读(929)  评论(0编辑  收藏  举报

说明

消息列队 基于PHP 实现。 之前 用python 的 flower 实现了 列队。  今天这里我们用的是 PHP 来实现; 在实际的业务环境中 PHP 用的多些;

PHP 实现列队 最重要的是用到了 redis list类型的 的 blPop 方法 的阻塞行为; bLPop方法 会移除list 中的一个元素 并放回该元素, 当list 为空时 可以设置 阻塞时间 过了这个时间会再次检测;以此来实现列队不中断程序检查list ;

当 详细说明 blpop 详细

列队添加数据

http://192.168.1.212:7575/task.php?&type=1&num=200

向列队中添加200 条测试数据

<?php


function intodata($num=1000){
        $redis=new Redis();
        $redis->connect('redis',6379);
        echo "redis is runimg".$redis->ping();
        //echo "check redis is runing:";
        for ($i=0; $i < $num; $i++) {
                $data['id']=$i+1;
                $data['str']=md5(mt_rand(2,2000));
                $redis->rPush('goods:task',json_encode($data));
        }
        $redis->close();
        return true;
}




switch ($_GET['type']) {
        case '1':
                // add...data
                $num=$_GET['num']?$_GET['num']:10;
                $adddata=intodata($num);
                var_dump($adddata);
                break;
        case '2':
                # code...
                break;
        case '3':
                # code...
                break;

        default:
                # code...
                break;
}

执行列队

php queueBloop.php

<?php
$redis=new Redis();
$redis->connect('redis',6379);
// 出队
while (true) {
    // 阻塞设置超时时间为3秒
    $task = $redis->blPop(array('goods:task'), 3);
    if ($task) {
        $redis->rPush('goods:success:task', $task[1]);
        $task = json_decode($task[1], true);
        echo $task['id'] . ':' . $task['cid'] . ':' . 'handle success';
        echo PHP_EOL;
        sleep(1);
    } else {
        echo 'nothing' . PHP_EOL;
        sleep(5);
    }
}


运行环境

参考

@ https://github.com/ranmufei

校友通微信小程序

校友通微信小程序