欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

一个iframe实现长轮询,通过PHP查询数据库并用JS更新页面内容的程序,问题是并不是每一条MYSQL的INSERT消息都能显示到页面,求帮忙分析下哪里有问题

程序员文章站 2022-05-04 12:58:07
...
本帖最后由 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代码:

在线客服系统