Redis是一个轻量级的key-value型数据存储系统,相对于memcache/memcached,提供了更多的冗余性,并且可以将存储的数据转存到磁盘文件中,以便下次启动时恢复。同时Redis提供了集合、列表等数据结构。
结合以上特性,采用Redis作为聊天室的数据存储解决方案,可获得较高的执行效率。
直接贴服务端代码了,需要php_redis扩展支持,没有用户系统没做,这个程序目前是挂到一个phpwind论坛里的,直接从全局变量读取用户和用户组。
界面部分在此省略。
完整演示可参考http://bbs.91d2.cn/,点击快捷操作栏右下角的“论坛聊天室”即可打开。
<?php
define('DISABLE_REFRESH_LIMIT', 1);
require_once('global.php');
header('Content-Type: text/html; charset=UTF-8');
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$if_init = get_string('chat_init');
if(!$if_init)
{
if(get_string('chat_init_lock')){die;}
set_string('chat_init_lock', '1');
set_array('chat_channel', array('GLOBAL'));
set_array('chat_motd', array('GLOBAL' => 'Hello!'));
set_array('chat_online', array());
set_string('chat_init', '1');
set_string("0_name", '系统');
set_string("0_flag", 'SA');
}
if(!$winduid){
echo 'chatLogin();';
die;
}
set_string("{$winduid}_name", $windid);
set_string("uid_{$windid}", $winduid);
$channel_list = get_array('chat_channel');
$channel_motd = get_array('chat_motd');
$my_channel = get_string("{$winduid}_in");
$my_index = get_string("{$winduid}_index");
if(!$my_channel || !in_array($my_channel, $channel_list)){
$my_channel = $channel_list[0];
set_string("{$winduid}_in", $my_channel);
$my_index = 0;
}
$channel_index = get_string("{$my_channel}_index");
$channel_ca = get_array("{$my_channel}_ca");
if ($winddb['groupid'] == 3 || $winddb['groupid'] == 4 || $winddb['groupid