ajax推技术,在线服务器端向客户端发送数据

ajax推技术,用浏览器访问该网页后,为什么我的代码每次用insert 向数据库插入数据后,当第三次插入数据的时候才会有效果,将$mes显示在浏览器上?
代码如下:
<?PHP
header("content-type:text/html;charset=utf-8");
set_time_limit(0);//设置服务器脚本的最大执行时间。

$conn=mysql_connect('localhost','root','123456');
mysql_query('use test',$conn);
mysql_query('set names utf8',$conn);
echo str_repeat(' ',4500);
echo 'welcome you';
//首先将welcome推送出去。
ob_flush();
flush();
while(true){
$co=mysql_query( "select * from mes where flag=1",$conn);
$row = mysql_fetch_assoc($co);

    //echo 'ni';
    if(!empty($row)){
           echo str_repeat(' ',4500);
            //echo'<pre>';
            //echo $row['name'];
            //echo'</pre>';
            $mes = json_encode($row);
            //echo "<script type = 'text/javascript'>";
            //echo "alert($mes);";
            //echo "</script>";
            echo 'ni';
            $co=mysql_query( "update mes set flag = 0 where id= ".$row['id'],$conn);
            ob_flush();//这两行应该放在if语句内部,因为我们检索到有消息后才能推送消息,如果放在if外部,那么每次循环都会推送信息,这样后者会浪费服务器资源。
            flush();
    } 

    sleep(1);

}
/*

数据库:
mysql> select *from mes;
+-----+------+------+------+
| id | mes | flag | sign |
+-----+------+------+------+
| 1 | 1 | 0 | 1 |
| 2 | 1 | 0 | 1 |
| 3 | 1 | 0 | 1 |
| 4 | 1 | 0 | 1 |
| 108 | 1 | 0 | 1 |
| 109 | 1 | 0 | 1 |
| 110 | 1 | 0 | 1 |
| 111 | 1 | 0 | 1 |
| 112 | 1 | 0 | 1 |
| 113 | 1 | 0 | 1 |
+-----+------+------+------+

效果:我们每次用mysql> insert into mes (mes,flag,sign) values(1,1,1);
那么该信息会立刻显示在前台浏览器,实现在线服务器端向浏览器推送数据。

建表代码:
| mes | CREATE TABLE mes (
id int(11) NOT NULL AUTO_INCREMENT,
mes varchar(100) DEFAULT NULL,
flag tinyint(4) DEFAULT '0',
sign tinyint(4) DEFAULT '0',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8 |
*/

?>

要看服务器有没有发送数据,浏览器怎么处理的

楼主的js代码呢?用的streaming ajax

ajax请求浏览器如果不支持streaming ajax,就是状态3就可以获取数据,会报错的

ajax推技术实际上也是拉数据,只是把超时时间设置的比较长,直到服务器有数据了才返回。

答案:经过认真研究,该原因是由于浏览器断开连接后,没有加入终止服务器脚本运行的代码。因为上次访问该页面后,然后在浏览器端关闭页面,实际上服务器端的php代码仍然没有因为浏览器关闭页面而终止运行,因此当你再次打开该页面时候,相当于有两个页面在同时访问同一个页面,因此出现了上述问题。