2012-02-07 6 views
9

誰かがこれらの2つのファイルを保存して実行して、「ob_flush()[ref.outcontrol]:バッファをフラッシュできませんでした。私は周りにグーグルを試みて、それは私がob_start()を使用する必要があると言います。しかし、私はそれを行うときに行ごとにプリントアウトするのではなく、完了したらFORループからオブジェクト全体を返します。私は..PHPエラー:ob_flush()[ref.outcontrol]:バッファのフラッシュに失敗しました。フラッシュするバッファがありません

test_process.php

// This script will write numbers from 1 to 100 into file 
// And sends continuously info to user 
$fp = fopen('/tmp/output.txt', 'w') or die('Failed to open'); 
set_time_limit(120); 
ignore_user_abort(true); 

for($i = 0; $i < 100; $i++){ 
    echo "<script type=\"text/javascript\">parent.document.getElementById('foo').innerHTML += 'Line $i<br />';</script>"; 
    echo str_repeat(' ', 2048); 
    flush(); 
    ob_flush(); 
    sleep(1); 
    fwrite($fp, "$i\n"); 
} 

fclose($fp); 

main.htmlとのob_startある

<html> 
    <head> 
     <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript" charset="utf-8"></script> 

     <style type="text/css" media="screen"> 
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid} 
      .new{ background-color:#3B9957;} 
      .error{ background-color:#992E36;} 
     </style> 

    </head> 
    <body> 

     <iframe id="loadarea" width="1024px" height="768px"></iframe><br /> 
     <script> 
      function helper() { 
       document.getElementById('loadarea').src = 'test_process.php'; 
      } 
      function kill() { 
       document.getElementById('loadarea').src = ''; 
      } 
     </script> 

     <input type="button" onclick="helper()" value="Start"> 
     <input type="button" onclick="kill()" value="Stop"> 
     <div id="foo"></div> 


</body> 
</html> 
+0

出力バッファについてphp.iniのあなたの設定を確認し、自動にon_startするために有効にすることができます。有効になっているかどうかを確認するもう1つの方法は、開始時にob_end_flush()を使用してすべてのフラッシュを削除する方法です。 また、 'phpinfo();'で確認できます。 – dvicino

+0

お返事ありがとうございます。私は出力バッファリングを有効にしようとしましたが、それは、行単位ではなくループオブジェクト全体を返します。 – ThreaT

答えて

10

私はあなたがflush()ob_flush()を混乱していると思います。 ob_start()ob_flush()はすべての出力をキャッチするPHPの内部出力バッファを処理しますが、flush()は他のプログラミング言語のようにSTDOUTをフラッシュする通常の関数です。

例:

<?php 
ob_start(); 
echo "Foobar\nFoobar\nFoobar\n"; 
// Nothing printed yet 
ob_flush(); // Now it is printed. 

echo "Foobar\n"; // Printed directly, because contains a line ending. 

echo "Foobar"; // Not printed, because normally buffers are flushed on line endings 
flush(); // Printed. 

EDIT:あなたのウェブサーバがコンテンツをバッファリングすることができるので、

あなたの出力は、印刷されません。圧縮と出力のバッファリングを無効にしてください。

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

SafariとInternet Explorerには1Kの内部バッファがあります。そのため、1KBのパディングデータ(空白など)を追加してレンダリングする必要があります。

編集2: 実装が壊れています。あなたはajaxであなたのデータをポーリングしたいと思う。クライアント側でのjQueryを使用します。

<div id="counter">0%</div> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"> 
<script type="text/javascript"> 
function doPoll(){ 
    $.post('script-that-returns-stuff.php', function(data) { 
     $("#counter").html(data); 
     setTimeout(doPoll,5000); 
    }); 
} 
doPoll(); 
</script> 

次にscript-that-returns-stuff.phpに:

<?php 
$file = explode("\n", file_get_contents("/tmp/output.txt")); 
$last_line = $file[count($file)-1]; 
echo $last_line."%"; 
+0

こんにちは - ありがとうございます。私はあなたの提案を試みましたが、何らかの理由でそれが行単位で返されるのではなく、処理を完了した後でのみforループの結果全体を返します。 – ThreaT

+0

私は役に立つかもしれない編集を追加しました。 – iblue

+0

私はそれを試しましたが、まだ運がありません:/ – ThreaT

1

ので、私は確信して他にどこを見ていないんだPHPにちょっと新たなんです()?

ob_flushは出力バッファをファイルハンドルにフラッシュします。たぶんそれは間違っているかもしれません。

例:

ob_start(); //start output buffering 
echo 'hello world'; //not outputed 
ob_flush(); //sends the output buffer so displays hello world. 

manual

+0

こんにちは、あなたの応答に感謝します。上記のコードでは含まれていませんでした。なぜなら、私はそれを行ごとに返すのではなく、処理を完了した後にのみforループの結果全体を返します。 – ThreaT

13

あなたのみ必要ob_flush()出力バッファがアクティブ(例えばob_start()によって、または構成設定によって)である場合。まだ持っていない場合は、ob_flush()を削除してください。それとも、それを条件付きにすることができます

if(ob_get_level() > 0) ob_flush(); 
+0

こんにちは、お返事ありがとうございます。私はob_flush()を取り出しようとしましたが、ループオブジェクト全体を返します。 – ThreaT

+0

PHPとWebサーバー、プロキシやネットワーク上のホップ、ローカルネットワーク、ローカルコンピューター、ローカルブラウザーで、あなたとUAの間のルート上のどこにでも表示を行うことができます。たいていの場合、ヒントを得ることができます(また、出力バッファが有効でない場合、 'ob_flush'は何も役に立ちません)。もし必要ならば、HTTPを使うべきではありません。 – Wrikken

+0

しかし、何らかの理由でob_flush()があるときに動作しますが、そのエラーもスローされますので、エラーがただちに消えてしまえば完璧です – ThreaT

関連する問題