0

今日は奇妙な問題に直面しました。

数か月間、PHP でバッファ フラッシュを使用して、小さな文字列サイズを問題なくクライアントに送信しました。

今日、プロジェクトに戻ったところ、サーバーが 512 バイト未満の文字列を送信しないことが判明しました。

これが私のコードです:

<?php
    echo "length:".$myUpcomingStringSize;
    ob_flush();
    flush();

    sleep(1);

    for($i = 0; $i < count($allLines); $++) {
        echo $allLines[$i];
        ob_flush();
        flush();
    }
?>

このコードは、昨年全体で魅力的に機能しました。そして今、それはもうありません。少し遊んで、ランダムなキャラクターをいくつか追加しました。文字列のサイズが 512 以上になると、サーバーはバッファの内容を送信します。

ここで解決しなければならない問題を想像できる人はいますか? この問題に直面している人はいますか?または、誰かがこの最小パケット サイズを構成する方法を知っていますか?

4

1 に答える 1

1

プログラムもサーバーも変更しなかった場合は、プログラムが意図したとおりに機能しなかったと想定する必要があります。特にWindowsシステムは、特定のバイト数が出力バッファに入るまで出力をバッファリングすることが知られています。このバッファリングはシステムレベルで行われるため、PHP構成の影響を受けることはありません。

出力バッファが送信するために必要な最小値が512バイトであることがわかっている場合は、次のようなものを使用できます。

define('MIN_OUTPUT_LENGTH', 512);
echo str_pad("length: $myUpcomingStringSize", MIN_OUTPUT_LENGTH, "\0"), '\n';
// (If you run into trouble with the null-bytes, use space character instead)

ノート

  • 「ユーザースペース」出力バッファリングを使用しない場合ob_flush();は、冗長です。
  • ループに遅延がない場合はfor、ライン間のフラッシュはお勧めできません。特に、ネットワークができるだけ多くのデータを1つのパケットにパックしようとするモバイルアプリケーションの場合。
  • forループヘッダーに構文エラーがあります(式$++に変数識別子がない可能性がありますi
于 2013-01-09T08:28:03.543 に答える