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

利用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;

 

posted @ 2014-04-23 17:31  iyoule  阅读(539)  评论(0编辑  收藏  举报