浏览器网页关闭,对应的php程序仍在执行
浏览器中的网页关闭,对应的php程序没有随着网页关闭而终止,而是要执行完毕。用例:
<?php
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
for($i=0;$i<20;$i++){
$time=time();
mysql_query("insert into test.t1 values(0,'$time')");
sleep(1);
}访问网页,然后立即关闭网页,php程序仍会插完20条记录才终止。小弟的问题:我一直认为php程序无论是浏览器还是命令行上执行
只要关闭了,就会自动停止,
难道关了 后台还能一直执行程序 有点晕了  求大牛帮忙捋一捋  跪谢 祝好心人一生平安

解决方案 »

  1.   

    是的,前台客户端关闭网页只是关闭了一个socket,对服务器来说,如果非detach模式的话,是要把该页面的所有内容执行完毕,只是执行完毕的输出页面内容无法到达客户端而已。detach模式退出进程也不是好的做法,况且php实现过程不一定用了创建detach线程来做。
      

  2.   

    php默认设置是在浏览器关闭后终止当前程序(可以人为改变)那么php是如何知道浏览器被关闭的呢?这是问题的关键
    每当php程序有输出时(echo、print...)php会检查用户连接是否还存在,如不存在了就判定浏览器关闭了在你的代码中并没有诸如echo之类的语句,那么php就不会去检查浏览器是否被关闭了
    于是就出现了你观察到的现象,这是正常的!
      

  3.   


    徐哥好像说的没到重点上<?php
    set_time_limit(0);
    $link = mysql_connect("localhost","root","123456");
    $conn = mysql_select_db("test2");
    for($i=0; $i<100; $i++) {
    echo "$i"."<br/>";
    $sql = "insert into demo values(null,$i)";
    $query = mysql_query($sql) or die(mysql_error());
    sleep(1);
    }
    ?>
    上面这个代码 有echo输出了 奈何 打开浏览求执行 立即关闭 还是能插入100条 不信徐哥你亲自试试 麻烦徐哥了 跪谢 祝好心人有好报 thx
      

  4.   

    版主已然说到重点,你需要在循环体内加入flush();
    ob_flush();这两行,再试
      

  5.   

    确实行了 太神奇了
    就是不知道为什么只加flush();这一句 就失灵了
    或者只加ob_flush();这一句 同样失灵了奈何两句都要加啊 不都是输出缓存吗 最后麻烦大哥帮人帮到底 帮解惑小弟这最后一个问题 跪谢 祝大哥万事顺利 家庭幸福
      

  6.   

    复制自手册“……必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。……”