【问题标题】:Why doesn't this PHP code (comet) work?为什么这个 PHP 代码(彗星)不起作用?
【发布时间】:2010-12-23 14:50:33
【问题描述】:
set_time_limit(0);

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
flush();

while($i < 10)
{
    sleep(1);
    $i++;
    echo $i;
    flush();
}

为什么我的代码没有打印出 1,然后等待并打印 2,然后等待并打印 3。相反,它只是等待 10 秒并一次打印出 12345678910?

有没有办法按我的要求分块打印?

【问题讨论】:

    标签: php comet


    【解决方案1】:

    可能是因为output buffering。尝试在文件顶部添加它以关闭所有打开的缓冲区:

    while(ob_get_level() > 0) {
        ob_end_flush();
    }
    

    您也可以在代码中的flush() 命令之后添加ob_flush()

    $i++;
    echo $i;
    flush();
    ob_flush();
    

    (请注意,您应该只做其中一个,而不是两个,但尝试一下)...

    【讨论】:

    • while(ob_get_level() > 0) { ob_end_flush(); } set_time_limit(0); header("Cache-Control: no-cache, must-revalidate"); header("过期时间:星期一,1997 年 7 月 26 日 05:00:00 GMT");冲洗(); while($i
    • 您使用的是什么浏览器(我知道 Chrome 在渲染之前有一个缓冲区)?您可以尝试打开telnet中的页面,看看是浏览器问题还是服务器问题...
    • 我正在使用 Chrome,我刚刚在 Safari 中尝试过,但它也无法正常工作 - telnet?我不知道该怎么做,但如果可以的话,网址是develop.davzy.com/forum/test.php
    • @user309641:它在 Firefox 中对我来说很好用。一定是 Chrome 和 Safari(因为它们都是 webkit 浏览器)在渲染之前都需要一个缓冲区来填充。但它在这里对我来说很好,所以你的服务器端代码运行良好(现在是浏览器问题)......
    • 啊爆炸!我想在客户端使用 iframe 方法做一个小彗星脚本,但是我现在有什么方法可以在 webkit 上做到这一点吗?
    【解决方案2】:

    问题可能是您需要一些垃圾数据才能在某些网络浏览器中启动流式传输。

    来自link的引用

    首先,服务器必须推送一些 垃圾数据(大约 2k)到浏览器 在你推送真实数据之前。所以就 写出一些 javascript cmets 到 浏览器优先。

    for (int i = 0; i < 10; i++) {   
      write.print("<!——————————————–this is junk—————–!>"); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2018-11-05
      • 2012-02-22
      • 2023-03-03
      • 2017-10-02
      • 2016-07-10
      • 2010-12-14
      相关资源
      最近更新 更多