Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。
发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。
关系图如下:

【一】.现在模拟下发布消息到对应频道,订阅对应频道接收消息。假设我们现在有一个名为FM88.7的redis频道(哈哈,这是中国国际广播电台的频道)
(1). Redis采用SUBSCRIBE命令订阅某个频道。现在我们订阅下FM88.7频道,命令是:SUBSCRIBE 频道名称 (可以多开几个命令行窗口当做是多个人订阅这个频道),其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。
SUBSCRIBE FM88.7 //执行后窗口一直挂起在接收频道信息
(2). Redis采用PUBLISH命令发送消息到对应频道。现在我们发送消息到FM88.7,让订阅的人都收到,命令为:PUBLISH 频道名称 消息内容 ,其返回值为接收到该消息的订阅者的数量。
PUBLISH FM88.7 "welcome to fm88.7" //返回2,因为在第一步我开启了2个窗口,相当于2个人订阅这个频道
(3). 从上面来看,我们必须要知道这个频道才能去收听频道的内容,那我能不能和FM收音机一样支持自动搜索呢?支持的,Redis提供Psubscribe 命令订阅一个或多个符合给定模式的频道。每个模式以 * 作为匹配符。警告:如果你使用普通订阅和这个匹配订阅同时订阅一个频道,这个频道的消息你每次都会收到2条,只不过这两条消息的类型不同,一个是message类型,一个是pmessage类型,但其内容相同。
Psubscribe * //订阅所有频道 Psubscribe news* //订阅所有以news开头的频道
(4). 退订频道命令是:
UNSUBSCRIBE 频道名称 //单个退订 UNSUBSCRIBE * //全部退订 UNSUBSCRIBE news* //退订所有以news开头的频道
【二】.PHP代码实现。由于订阅频道后客户端是阻塞的接收信息,所以订阅者都是以cli模式运行。
(1).redis.php:连接redis,返回redis对象
<?php
($redis = new Redis())->connect('127.0.0.1', 6379); (2)sub.php:订阅者,开启2个cli运行
<?php
include './redis.php';
global $redis;
/**
* 参数1: 传递需要订阅的频道数组,支持多个
* 参数2: 传递回调函数
*/
$redis->subscribe(['FM88.7'],function (Redis $instance, $channel, $message){
echo '频道:'.$channel.PHP_EOL;
echo '消息:'.$message.PHP_EOL;
});(3)pub.php:发布者
<?php
include './redis.php';
global $redis;
/**
* 参数1: 频道名称
* 参数2: 频道消息
*/
$result = $redis->publish('FM88.7', 'welcome to fm88.7'); 1、允许单个域名访问指定某域名(http://client.runoob.com)跨域访问,则只需在http://server.runoob.com/server.php文件头部添加如下代码:header('Access-Control-Allow-Origin:http://client....
在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...
最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...
PHP简单定时器可以通过pcntl_signal创建闹钟信号来实现。但是缺点很明显,性能一般,要自己实现守护进程,不支持毫秒级定时器,单进程不支持多个闹钟信号,不能跨平台运行event扩展支持的事件多,性能高。<?php //创建event配置.[空配置] $eventConfig ...