2

現在、Codeigniter でロング ポーリング機能を実装していて、問題が発生しました。

通常のPHPコントローラーがあるとしましょう:

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

       while(true){  
                    echo "test";

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

ページは、呼び出されたときに読み込み中と言っているだけで、「テスト」を返さず、しばらくすると 404 エラーが発生します。

私は何を間違っていますか?

ありがとうございました!

4

3 に答える 3

0

「間違った」ことは何もしていません。それは、phpが期待どおりに機能しないということだけです。

あなたがこのようにそれをしたならば:

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

最終的には多くのHiThereを出力しますが、一度に1つは出力せず、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 ファイルの実行がファイルの最後に到達するまでロードを続けます。PHP は C や C++ のようには機能しません。リクエストを行い、すべてが完了すると出力が得られます。ページが読み込まれると、PHP は実行されなくなります。

またsleep()、場合によっては PHP を遅くするために使用されます。この場合:

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

「something」と「else」は同時に出力されますが、全体の実行には 30 秒以上かかります。

于 2012-11-21T16:45:29.140 に答える
0

私自身、このような問題に遭遇しました。特定のしきい値に達するまで、php および/または Web サーバーがデータをバッファリングしている可能性があるため、出力をフラッシュすることを検討する必要があります。私はこれに関して IIS と格闘するのにひどい時間を過ごしました. さらに、ウェブサーバーに何をすべきかを伝えることもあります。Apache の場合、php.netで見つかったスニペットを次に示します。

flush() と ob_flush() で問題が発生しました。この問題を解決するために私がしたことは、理解するのに時間がかかったので、私が思いついたことを共有したいと思います.

主な問題は、php 設定の "output_buffering" です。設定が大きすぎると、テキストが出力されなくなります。この値を変更するには、php.ini で設定するか、次の行を追加します。

php_value output_buffering "0"

.htaccess ファイルに。PHP_INI_PERDIR であるため、ini_set() では機能しません。

これは、sleep() の前に使用される flush() 関数と組み合わされます。また、適切にフラッシュを開始する前に、いくつかの文字を出力する必要がありました。

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

また。サーバーでこれを試したところ、htaccess ファイルに php_value 行を追加するまで機能しませんでした。私がやったら、それは期待どおりに機能しました。

于 2012-11-21T15:01:33.593 に答える