Codeigniter LongPolling“while(true)”不起作用?

时间:2012-11-21 14:41:27

标签: php javascript html codeigniter long-polling

我目前正在Codeigniter中实现一个长轮询功能,并且遇到了一个问题。

假设我有一个普通的PHP控制器:

function longpolling()
{
    //PHP Timelimit infinite
    set_time_limit(0);

       while(true){  
                    echo "test";

                   //Sleep 3 Seconds
                     sleep(3);
             }
}

该页面只是在调用时加载并且不返回“test”而是在一段时间后得到404错误。

我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

你没有做任何'错误',只是因为php没有按照你期望的方式工作。

如果你这样做:

$i = 0;
while ($i < 10)
{
    echo "Hi There!";
    sleep(2);
    $i++;
}

它最终会输出很多Hi There,但不会一次输出一个,而是会在while循环结束时显示。

你甚至可以在那里抛出一个flush()

$i = 0;
while ($i < 10)
{
    echo "Hi There!";
    flush();
    sleep(2);
    $i++;
}

直到最后你还没有得到任何东西。

因为你的while(true)永远不会结束,你永远不会看到任何输出,我认为浏览器超时开始了?或者达到了max_execution_time设置?

刚刚突然出现在我的脑海中:如果你在一个无限循环的文件中写了一些数据我可能会工作,我自己从未尝试过。

答案 1 :(得分:0)

我自己也遇到过这样的问题。您将不得不考虑将输出刷新为php和/或Web服务器可能正在缓冲数据,直到达到某个阈值。我在这方面遇到了可怕的时间,我认为Apache更容易管理。此外,还告诉网络服务器该做什么。对于apache,这是php.net上的代码段:

  

我在flush()和ob_flush()方面遇到了一些问题。我做了什么   解决这个问题花了我一些时间弄清楚所以我想   分享我的想法。

     

主要问题是php设置“output_buffering”即可   设置太大会阻止您的文本输出。改变   您可以在php.ini中设置此值,也可以添加行

     

php_value output_buffering“0”

     

到你的.htaccess文件。它不适用于ini_set(),因为它是   PHP_INI_PERDIR。

这与sleep()之前使用的flush()函数结合使用。在开始正确刷新之前,我还必须输出多个字符:

    public function longpolling()
    {
        echo str_repeat(" ", 1024); flush();
        for( $i = 0; $i < 10; $i++) {
            echo $i."<br/>";
            flush();
            sleep(1);
        }
    }

另外。我刚刚在我的服务器上尝试了这个,直到我将php_value行添加到我的htaccess文件中它才会起作用。一旦我做了,它按预期工作。

答案 2 :(得分:0)

页面将继续加载,直到PHP文件执行到达文件末尾。 PHP不像C或C ++那样工作。您提出请求,一切都完成后,您将获得输出。一旦页面加载,就不再执行PHP了。

在某些情况下,sleep()仅用于降低PHP的速度。在这种情况下:

echo "Something";
sleep(30);
echo " else";

“Something”和“else”将在同一时刻打印,而总执行时间将延长30秒。