本帖最后由 stneo1990 于 2013-08-08 11:45:06 编辑   首先,这是一个仿客服咨询的实时通讯系统,主要目的是将模拟前台用户发送的消息(通过手动INSERT进MYSQL数据库实现)由服务器实时推送到前台客服页面上,大致结构如下:  
 1、在前台kefu.html页面上有一个iframe,这个iframe请求后台query.php查询程序(iframe在页面上隐藏了)  
 2、query.php通过一个while(true)死循环并设置set_time_limit(0),然后,在循环中不断的进行SQL查询,将用户发送的未读的消息查询出来,并通过输出JS代码,操作父页面的
区,将查询出来的消息结果输出到页面上  
 3、我通过手动INSERT一些数据,来模拟用户的消息提交, 默认消息是未读状态,当query.php读取后,会改变其为已读状态    
 现在的问题是:当我打开页面后(或者关闭页面再重新打开程序),一般最开始插入的数据都不能被显示到页面上,但是这些消息的状态却已经被query.php改为已读(也就是query.php已经查询到这条记录并发送JS代码到前端了),而当我继续插入很多条之后,前端才开始显示记录,并且之前INSERT的记录都是被标记为已读状态了,但是却没有显示到前台kefu.html页面上,要插入很多条之后,或者等一段时间后才能恢复正常    
 整个程序并没有问题,因为之后的程序就是正常的可以一条一条显示了,插入一条前台就显示一条(但是偶尔中途也会丢失一条)    
 我猜测问题的根源可能有两点:  
 1、PHP的脚本并没有被结束  
 2、JS可能有缓存导致虽然接收到了数据,但没有更新    
 不过以上两点我都不确定,我觉得可能问题没这么简单,应该是违反或者没有注意某个机理而造成的。    
 具体代码如下,还请各位帮忙看看问题出在了什么地方,也可以本地测试下,谢谢了。    
 测试方法:  
 手动在数据库中INSERT数据,然后观察前台kefu.html页面是否能及时收到并更新消息    
 数据库建表:  
 CREATE TABLE msg(  
 id int(11) NOT NULL auto_increment,  
 pos varchar(20) NOT NULL default '',  
 rec varchar(20) NOT NULL default '',  
 content varchar(200) NOT NULL default '',  
 isread` int(1) NOT NULL default '0',  
 PRIMARY KEY(id)  
 );    
 插入数据示例:  
 insert into msg(rec,pos,content,isread) values('admin','zhangsan','hello',0);   
回复讨论(解决方案)
   前台kefu.html代码:  
  
      在线客服系统                    在线客服系统--客服端
                回复:
                  
    后端查询query.php代码:  
  
';ob_flush();flush();$i = 0;require 'conn.php';//连接数据库文件//不断循环查询消息while(true){	//查询接收者为admin,并且是未读的消息	$sql = 'select * from msg where rec = "admin" and isread = 0 limit 1';	$result = $conn -> query($sql);	//提取查询结果	$rs = $result -> fetch_assoc();	if(!empty($rs)){		//将这条消息更新为已读状态		$sql = 'update msg set isread = 1 where id = "'.$rs['id'].'" limit 1';		$conn -> query($sql);		//转换为JSON格式准备发送给JS		$rs = json_encode($rs);		//通过paren调用父窗体的comet()函数,并将转换的JSON数据传送过去,comet()函数可以在kefu.html代码中找到		echo '';	}	ob_flush();	flush();	//防止查询次数过多,设置的每1秒查询一次	sleep(1);}    数据库连接conn.php代码:  
  
 query('set names utf8');    建议还是采用AJAX的轮询方式,这种的后台查询脚本里没有主动结束脚本执行,可能存在一定问题。 
   我测试的是只能显示一个 后面的都显示不出来