您的位置:首页 > 其它

web在线聊天系统。非ajax轮询

2014-04-23 17:31 218 查看
利用php的死循环和刷新缓冲区实现。

浏览器发送请求到PHP获取消息页面。

php接收到来之浏览器请求后。 循环获取数据库里面的消息。
当存在消息的时候。PHP告诉浏览器。我有消息给你。你接受一下。但是我的消息还还有哦。你要等我发完之后才能闪哦。、

浏览器:哦。你还有话说啊。那我先把你说的东西输出出来。我等你说。你啥时候说完。我啥时候闪。

上线项目。建议利用Memcache使用 .同时大型项目。不建议。比如。假设网站有20ip、的流量如果这20ip都使用了这个系统。那么服务器将始终保持这20w的连接


/**
* 接受消息
*/
set_time_limit(0);

header('content-type:text/html;charset=utf-8');
$con = new mysqli('localhost','root','','test');

$sql_ = "select id,content from msg where id > %d limit 1";

$i = 0;
while(true){
$sql = sprintf($sql_,$i);
$a = $con->query($sql);
$ret = $a->fetch_array();
if(is_null($ret)){
usleep(100);
echo '';
flush();
ob_flush();
}else{
$i = (int)$ret['id'];
var_dump($ret['content']);
flush();
ob_flush();
}
}


发送消息

/**
* 发送消息代码
*/
if(isset($_GET['msg'])){
$msg = $_GET['msg'];
$con = new mysqli('localhost','root','','test');

$msg = htmlspecialchars($msg);
$sql = "INSERT INTO `msg` (`content`) VALUES ('%s')";
$sql = sprintf($sql,$msg);
$a = $con->query($sql);
$con->close();
}

?>
<meta charset="utf-8"/>
<form>
<textarea name="msg"></textarea>
<input type="submit" value="提交">
</form>


数据库

DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content` text CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: