redis 发布和订阅的php应用(异步任务处理)

Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:


redis 发布和订阅的php应用(异步任务处理)_第1张图片
pubsub1

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:


redis 发布和订阅的php应用(异步任务处理)_第2张图片
pubsub2

PHP应用

可简单利用redis的这一功能做一个异步任务处理应用,首先建立一个(任务)订阅者,接收(任务)发布者发送的任务消息。

//taskWorker.php 任务处理者
ini_set('default_socket_timeout', -1);  //避免在默认的配置下,1分钟后终端了与redis服务器的链接
$redis = new Redis();
$redis->connect('192.168.1.12',6379);
$redis->subscribe(['task_queue'], function($redis,$chan,$msg){
    switch ($chan) {
        case 'task_queue':
            $task = unserialize($msg);
            if($task['task']=='send_email'){
                // send email
            }
            // do other job
            break;
        default:
            break;
    }
});

运行该脚本:

php taskWorker.php

生产环境中可利用supervisor后台运行该脚本,处理任务消息。可以把这个脚本当作一个任务处理机器,接收各种任务指示并处理。

//taskPub.php  任务发布者
$redis = new Redis();
$redis->connect('192.168.1.12');
$task = [
    'task'=>'send_email',
    'data'=>'你好,隔壁老王',
];
$redis->publish('task_queue', serialize($task));

该脚本可以封装成一个易用的类,融入与你的业务代码中进行任务添加。

你可能感兴趣的:(redis 发布和订阅的php应用(异步任务处理))