2

重複の可能性:
出力バッファリングとは?
なぜPHPは一度に送信するのですか?

リストからメールを送信するときに「送信済み」を動的にエコーしたい。私のスクリプトは、すべて終了した後にのみエコーします。while ループで文字列を動的にエコーするにはどうすればよいですか?

$f=fopen("list.txt","r");

if($f){

    while (!feof($f)) {

        $line = fgets($f, 4096);

        $lncount++;

        $val = $lines[$lncount];

        mailsender($line,$yollayan,$sifresi,$name);

        echo "sent";

    }
}
4

5 に答える 5

3

バッファリング用の出力を設定する必要があります。以下のスクリプトを試してください。リアルタイムの出力を表示するには、出力の圧縮を切り替えてください。

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0);
ob_implicit_flush(true);
ob_end_flush();

$f=fopen("list.txt","r");

if($f){

   while (!feof($f)) {

        $line = fgets($f, 4096);
        $lncount++;
        $val = $lines[$lncount];
        mailsender($line,$yollayan,$sifresi,$name);
        echo " sent";
    }
}
于 2012-07-20T12:43:16.927 に答える
1

私のスクリプトは、すべてが終了した後にのみエコーします。

おそらくそうですが、これが当てはまるかどうかを判断するのに十分な情報を提供していません。

ほとんどの場合、あなたの質問はこれと重複しています。

エコーの後にflush()を追加し、コマンドラインから実行すると、進行状況が表示されます。

于 2012-07-20T12:43:05.430 に答える
1

flush();これをブラウザーに送信するには、エコーの下で使用できます: http://php.net/manual/en/function.flush.php (詳細については、リンクのコメントを参照してください)。

于 2012-07-20T12:45:01.870 に答える
1

これを試して

  echo "Sent ";
  echo str_repeat("\n",1024);
  flush();

PHPマニュアルから:

flush() は、Web サーバーのバッファリング スキームをオーバーライドできない可能性があり、ブラウザのクライアント側のバッファリングには影響しません。[...]

mod_gzip のような Apache 用のサーバー モジュールは、独自のバッファリングを行う場合があり、これにより、flush() によってデータがクライアントにすぐに送信されなくなります。

ブラウザでさえ、入力を表示する前にバッファリングすることがあります。たとえば、Netscape は、行末またはタグの開始を受け取るまでテキストをバッファリングし、最も外側のテーブルのタグが表示されるまでテーブルをレンダリングしません。

Microsoft Internet Explorer の一部のバージョンは、256 バイトの出力を受信した後にのみページの表示を開始するため、フラッシュする前に余分な空白を送信して、それらのブラウザーにページを表示させる必要がある場合があります。

于 2012-07-20T12:39:27.260 に答える
0

あなたが見ている効果は、出力バッファリングです。保留中の出力を強制的に送信するには、 flush()関数を呼び出します。

さまざまなシナリオやさまざまなサーバーの種類で発生する可能性のあるさまざまな警告と考えられる制限をお読みください。

于 2012-07-20T12:41:11.603 に答える