php redis 处理websocket聊天记录的实例代码

具体代码如下所示:

<?phpini_set('display_errors', 'on');
class chatClass {
 private $redis;
 //这个变量模拟用户当前状态,是否登录,是否可查看
 public $checkUserReadable = false;
 //构造函数链接redis数据库
 public function __construct() {
  $this -> redis = new Redis();
  $this -> redis -> connect('127.0.0.1', '6379');
  $this -> redis -> auth('***cnblogs.com/handle');
 }
 /*
 发送消息时保存聊天记录
 * 这里用的redis存储是list数据类型
 * 两个人的聊天用一个list保存
 *
 * @from 消息发送者id
 * @to 消息接受者id
 * @meassage 消息内容
 *
 * 返回值,当前聊天的总聊天记录数
 */
 public function setChatRecord($from, $to, $message) {
  $data = array('from' => $from, 'to' => $to, 'message' => $message, 'sent' => time()/*, 'recd' => 0*/);
  $value = json_encode($data);
  //生成json字符串
  $keyName = 'rec:' . $this -> getRecKeyName($from, $to);
  //echo $keyName;
  $res = $this -> redis -> lPush($keyName, $value);
  if (!$this -> checkUserReadable) {//消息接受者无法立刻查看时,将消息设置为未读
   $this -> cacheUnreadMsg($from, $to);
  }
  return $res;
 }
 /*
 * 获取聊天记录
 * @from 消息发送者id
 * @to 消息接受者id
 * @num 获取的数量
 *
 * 返回值,指定长度的包含聊天记录的数组
 */
 public function getChatRecord($from, $to, $num) {
  $keyName = 'rec:' . $this -> getRecKeyName($from, $to);
  //echo $keyName;
  $recList = $this -> redis -> lRange($keyName, 0, (int)($num));
  return $recList;
 }
 /*
 * 当用户上线时,或点开聊天框时,获取未读消息的数目
 * @user 用户id
 *
 * 返回值,一个所有当前用户未读的消息的发送者和数组
 * 数组格式为‘消息发送者id'=>‘未读消息数目'
 *
 */
 public function getUnreadMsgCount($user) {
  return $this -> redis -> hGetAll('unread_' . $user);
 }
 /*
 * 获取未读消息的内容
 * 通过未读消息数目,在列表中取得最新的相应消息即为未读
 * @from 消息发送者id
 * @to 消息接受者id
 *
 * 返回值,包括所有未读消息内容的数组
 *
 *
 */
 public function getUnreadMsg($from, $to) {
  $countArr = $this -> getUnreadMsgCount($to);
  $count = $countArr[$from];
  $keyName = 'rec:' . $this -> getRecKeyName($from, $to);
  return $this -> redis -> lRange($keyName, 0, (int)($count));
 }
 /*
 * 将消息设为已读
 * 当一个用户打开另一个用户的聊天框时,将所有未读消息设为已读
 * 清楚未读消息中的缓存
 * @from 消息发送者id
 * @to 消息接受者id
 *
 * 返回值,成功将未读消息设为已读则返回true,没有未读消息则返回false
 */
 public function setUnreadToRead($from, $to) {
  $res = $this -> redis -> hDel('unread_' . $to, $from);
  return (bool)$res;
 }
 /*
 * 当用户不在线时,或者当前没有立刻接收消息时,缓存未读消息,将未读消息的数目和发送者信息存到一个与接受者关联的hash数据中
 *
 * @from 发送消息的用户id
 * @to 接收消息的用户id
 *
 * 返回值,当前两个用户聊天中的未读消息
 *
 */
 private function cacheUnreadMsg($from, $to) {
  return $this -> redis -> hIncrBy('unread_' . $to, $from, 1);
 }
 /*生成聊天记录的键名,即按大小规则将两个数字排序
 * @from 消息发送者id
 * @to 消息接受者id
 *
 *
 */
 private function getRecKeyName($from, $to) {
  return ($from > $to) ? $to . '_' . $from : $from . '_' . $to;
 }
}
/*
* 下面为测试用的代码 ,伪造数据模拟场景
* 假定有两个用户id为2和3 ,2 向 3 发送消息
*
$chat = new chatClass();
$chat -> checkUserReadable = true;
for ($i = 0; $i < 20; $i++) {
$chat -> setChatRecord('2', '3', 'message_' . $i);
}
echo 'get 20 chat records</br>';
$arr = $chat -> getChatRecord('2', '3', 20);
for ($j = 0; $j < count($arr); $j++) {
echo $arr[$j] . '</br>';
}
$chat -> checkUserReadable = false;
for ($m = 0; $m < 5; $m++) {
$chat -> setChatRecord('2', '3', 'message_' . $m);
}
echo "</br>";
$umsg_1 = $chat -> getUnreadMsgCount(3);
echo "Unread message counts ";
echo "</br>";
print_r($umsg_1);
echo "Unread message content </br> ";
$umsgContent = $chat -> getUnreadMsg(2, 3);
for ($n = 0; $n < count($umsgContent); $n++) {
echo $arr[$n] . '</br>';
}
echo "</br>";
$chat -> setUnreadToRead(2, 3);
$umsg_2 = $chat -> getUnreadMsgCount(3);
echo "</br>";
echo "Unread message counts ";
echo "</br>";
print_r($umsg_2);
*
*/
?>

总结

以上所述是小编给大家介绍的php redis 处理websocket聊天记录的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • php实现websocket实时消息推送

    php实现websocket实时消息推送,供大家参考,具体内容如下 SocketService.php <?php /** * Created by xwx * Date: 2017/10/18 * Time: 14:33 */ class SocketService { private $address = '0.0.0.0'; private $port = 8083; private $_sockets; public function __construct($address = '',

  • php中使用websocket详解

    在PHP中,开发者需要考虑的东西比较多,从socket的连接.建立.绑定.监听等都需要开发者自己去操作完成,对于初学者来说,难度方面也挺大的,所以本文的思路如下: 1.socket协议的简介 2.介绍client与server之间的连接原理 3.PHP中建立socket的过程讲解 4.用一个聊天室作为实例详细讲解在PHP中如何使用socket 一.socket协议的简介 WebSocket是什么,有什么优点 WebSocket是一个持久化的协议,这是相对于http非持久化来说的. 举个简单的例子

  • php+html5基于websocket实现聊天室的方法

    本文实例讲述了php+html5基于websocket实现聊天室的方法.分享给大家供大家参考.具体如下: html5的websocket 实现了双向通信,折腾了几天弄了个聊天室,分享给大家 <?php error_reporting(E_ALL); ob_implicit_flush(); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $sockets; public $users; public $master;

  • 详解php的socket通信

    对 TCP/IP . UDP . Socket 编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵. 那什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的. UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是属于TCP/IP协议族中的一种. 这里有一张图,表明了这些协议的

  • PHP的Socket通信之UDP通信实例

    本文实例讲述了PHP的Socket通信之UDP通信方法.分享给大家供大家参考.具体如下: 1.创建一简单的UDP服务器 //服务器信息 $server = 'udp://127.0.0.1:9998'; //消息结束符号 $msg_eof = "\n"; $socket = stream_socket_server($server, $errno, $errstr, STREAM_SERVER_BIND); if (!$socket) { die("$errstr ($err

  • php使用websocket示例详解

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket 套接字做了封装处理,开发者使用的时候只需要考虑数据的交互而不用处理连接的建立.而 php 没有,从 socket 的连接.建立.绑定.监听等,这些都需要我们自己去操作,所以有必要拿出来再说一说. ① 和 ② 实际上就是一个 HTTP 的请求和响应,只不过我们在处理的过程中我们拿到的是没有经过解析的

  • PHP实现websocket通信的方法示例

    本文实例讲述了PHP实现websocket通信的方法.分享给大家供大家参考,具体如下: 执行方法: 首先先修改server.php与index.html的ip 通过命令行执行 [php路径]\php.exe "[文件路径]\server.php" 然后通过浏览器打开index.html server.php <?php include 'websocket.class.php'; $config=array( 'address'=>'192.168.0.200', 'por

  • 详解PHP中websocket的使用方法

    关于PHP中websocket使用的详细注解,供大家参考. 服务端: <?php //send用户加入 //send1发送信息 //send2退出登录 error_reporting(E_ALL ^ E_NOTICE); ob_implicit_flush(); //file_put_contents('lz.text','123', FILE_APPEND); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $so

  • 使用swoole扩展php websocket示例

    复制代码 代码如下: <?phpdefine('DEBUG', 'on');define("WEBPATH", str_replace("\\","/", __DIR__));require __DIR__ . '/../libs/lib_config.php'; class WebSocket extends Swoole\Network\Protocol\WebSocket{    /**     * 下线时,通知所有人     */ 

  • php基于websocket搭建简易聊天室实践

    本文实例讲述了php基于websocket搭建简易聊天室实践.分享给大家供大家参考.具体如下: 1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短连接和长连接.短连接一般可以用ajax实现,长连接就是websocket.短连接实现起来比较简单,但是太过于消耗资源.websocket高效不过兼容存在点问题.websocket是html5的资源 2.前

  • 基于Swoole实现PHP与websocket聊天室

    websocket Websocket只是一个网络通信协议 就像 http.ftp等都是网络通信的协议:不要多想: 相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议: WebSocket和HTTP的关系 有交集,但是并不是全部. Websocket只是借用了HTTP的一部分协议来完成一次握手.(HTTP的三次握手,此处只完成一次) http和websocket 请求头对比: HTTP: 原来的时候,客户端通过http(骑马)带着信请求服务器,服务器处理请求(写回信

随机推荐