2

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

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

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

       while(true){  
                    echo "test";

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

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

我究竟做错了什么?

谢谢!

4

3 回答 3

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 设置?

现在突然出现在我的脑海中:如果您在无限循环中将一些数据写入文件,它可能会起作用,我自己从未尝试过。

于 2012-11-21T14:53:58.667 回答
0

我自己也遇到过这样的问题。您必须考虑将输出刷新为 php 和/或网络服务器可能正在缓冲数据,直到达到某个阈值。我在 IIS 上为此苦苦挣扎,我认为 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 文件中才起作用。一旦我这样做了,它就按预期工作了。

于 2012-11-21T15:01:33.593 回答
0

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

并且sleep()在某些情况下只是用来减慢 PHP 的速度。在这种情况下:

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

“Something”和“else”将同时打印,而总执行时间将增加 30 秒。

于 2012-11-21T16:45:29.140 回答