2012-08-05 26 views
8

私は自分が行っているプロジェクトでPHPのflush()関数に慣れようとしていますが、私はいくつかのスクリプトを自分で書いて、自分のウェブスペースにアップロードしました。しかし、彼らのどれも働いていないように見えました。私はPHP.netのコメントから以下のものを取り上げて試しました。PHPのflush()は私のLinuxマシンでは動作しますが、Windowsマシンでは動作しません。

<?php 
header('Content-type: text/html; charset=utf-8'); 

echo 'Begin ...<br />'; 
for($i = 0 ; $i < 10 ; $i++) 
{ 
    echo $i . '<br />'; 
    flush(); 
    sleep(1); 
} 
echo 'End ...<br />'; 

明らかにスクリプトSTILLは機能していませんでした。

は、私はその後言ったコメントを読んで:

あなたは(ob_flush呼び出す)と、まだ(フラッシュ)とは、バッファは、いくつかのウイルス対策ソフトウェア(この場合はパンダ)が保持しているため、それはあるかもしれないフラッシュを取得いけない場合ページがロードされてブラウザに送信されるまでバッファリングします。

私はLinux(Ubuntu 12.04)を使用しているマシンで、アンチウイルスソフトウェアをインストールしていないため、Webページをリクエストすることにしました。それは完璧に働いた!

これはウイルス対策ソフトウェアとは関係ありませんか? Windowsのflush()が意図した目的を達成できないという奇妙なメカニズムがあるので、私は両方のマシン(Firefox 14.0.1)で同じブラウザを使用しています。

私は本当に疑問に思っています。アンチウイルスソフトウェアについて知っている人は誰ですか?flush()が意図した目的を達成できないようにしていますか?もしそうなら、それを回避する方法はありますか?

EDIT:私はこれがサーバー側ではないことを肯定しています。Linuxを実行する外部Webサーバーがあります。これらのスクリプトは、LinuxまたはWindowsマシンのどちらでもローカルにホストしていません。

EDIT2:私はLinuxノートパソコンの友人の家の周りでこれを試してみました。私の家で働くことはできました。不思議なことに、フラッシュコードも自分の家では機能しませんでした。私の家のこのノートパソコンで動作するので不思議なことです)、ルーターがflush()関数の動作と何か関係があるかどうかはわかりません(私は本当にWeb上でこれについて何も見つけることができません)それは私がそれを妨害するかもしれないと考えることができる唯一のものだからです。

それ以外の場合は、私自身はこれを回避しようとしていませんが、これは間違いなくサーバ側とは関係ありません。私が見つけたと思われるほとんどの情報は、/

私はまた、私の家でNorton(AVGではなく)を実行しているPCでこれを試しましたが、それは100%ではありませんでした。

答えて

4

含めて、すぐに表示されてからの出力を防ぐことができますいくつかあります:

  • バッファリング
  • (何flush防止する)PHP内部からのバッファリングを圧縮するための十分なデータを蓄積するために、(とき
  • Webサーバーでのバッファリング(何らかの理由でこれを行うことがあります)
  • ブラウザ内でのバッファリング(ブラウザはさまざまな手法を使用してページロードが最後まで速くなるようにしますユーザー;これらの技術は、いつものようにすぐに利用可能であるなどのコンテンツを表示しないなどが)

flushは、このリスト上のすべてをコントロールすることはできませんので、本当にあなたはそれが期待通りにプログラムが振る舞うという保証はありません。

このすべてはflushのメモに記載されている:

は、PHPの書き込みバッファをフラッシュし、どんなバックエンドのPHP(CGI、Webサーバなど)を使用しています。これは、いくつかの注意点を持って、現在の出力をすべてブラウザ にプッシュしようとします。

flush()は、Webサーバーのバッファリングスキームをオーバーライドできない可能性があり、ブラウザ のクライアント側のバッファリングには影響しません。また、PHPのユーザ空間出力のバッファリングには影響しません メカニズム。つまり、ob出力バッファを使用している場合は、ob_flush()と flush()の両方を呼び出してob出力バッファをフラッシュする必要があります。

特に、Win32上のいくつかのサーバーは、結果がブラウザに送信される前に、スクリプトからの出力をバッファして終了します( )。

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

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

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

+0

私はこれは間違いなくしかし、クライアント側ではなくサーバ側で知って、同じページには、LinuxでFirefoxでレンダリングされたときに完全に働いていますが、Windowsの下で罰金ではありません。これは私がこれをブラウザ関連の問題ではないと思うように導く。 。 。それはその引用のすべての説明を排除しているようです:/ – Sean

+0

@SeanDunwoody:それはサーバー側ではないことをどうやって知っていますか?サーバーは、各OSの下で異なるプログラムです。同じことがブラウザにも当てはまります。 – Jon

+0

いや、申し訳ありません私はあなたが誤解だと思う、私はこの実行中のLinuxをホストしているサーバーを持って、私はどちらかのマシン – Sean

関連する問題