特性
- 消息发布者,即 publish 客户端,无需独占链接,你可以在 publish 消息的同时,使用同一个 redis-client 链接进行其他操作
- 消息订阅者,即 subscribe 客户端,需要独占链接,即进行 subscribe 期间,redis-client 无法穿插其他操作,此时 client 以阻塞的方式等待“publish 端”的消息,因此 subscribe 端需要使用单独的链接,甚至需要在额外的线程中使用。
代码示例
1. 订阅端代码(subscribe.php)
<?php// 设置不超时,否则会被 php.ini 中的超时限制时间
$redis = new Redis();// 创建一个长链接
$redis->pconnect('localhost', 6379, 0);
$redis->subscribe(['order'], function ($redis, $chan, $msg) {// 回调逻辑处理
var_dump($redis);
var_dump($chan);
var_dump($msg);
echo $channelName, "==>", $msg,PHP_EOL;
});
//subscribe 函数的第一个参数是一个数组,这意味着可以订阅多个发布端,回调函数里面有 3 个参数,第一个是 redis 实例,第二个是订阅的频道,第三个是订阅的消息内容,在命令下运行该文件就会进入等待发布端发布消息的阻塞状态!
PHP cli 模式执行
php subscribe.php
2. 发布端代码(publish.php)
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$order = [
'id' => 1,
'name' => 'iphone'
];
$redis->publish("order", json_encode($order));// 发布端代码可以是 phpcli 模式执行,也可以在项目代码里实现
3. 订阅端结果
class Redis#1 (1) {
public $socket =>
resource(5) of type (Redis Socket Buffer)
}
string(5) "order"
string(16) "{"id":1,"name":"iphone"}"
注:Redis 连接时的 connect 与 pconnect 的区别是什么?
connect:脚本结束之后连接就释放了。
pconnect:脚本结束之后连接不释放,连接保持在 php-fpm 进程中。每个 php-fpm 进程占用一个连接,当 php-fpm 进程结束时会释放掉;
所以使用 pconnect 代替 connect,可以减少频繁建立 redis 连接的消耗。
设置 Redis 连接永不超时,不然默认情况下会每分钟重新断开连接,提示“read error on connection to 127.0.0.1:6379”
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
正文完
有偿技术支持加微信