Ошибка PHP: ob_flush () : не удалось сбросить буфер. Нет буфера для сброса

Может кто-то, пожалуйста, сохраните эти 2 файла и запустите их и скажите, почему я получаю сообщение об ошибке «ob_flush () [ref.outcontrol]: не удалось сбросить буфер. Нет буфера для очистки». Я попробовал googling, и он говорит, что мне нужно использовать ob_start (); но когда я это делаю, он не печатает строки за строкой, а возвращает весь объект из цикла FOR, когда он завершен. Я немного новичок в PHP, поэтому я не уверен, где еще искать.

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

 <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> 

Я думаю, вы ob_flush() с толку ob_flush() с помощью 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. 

РЕДАКТИРОВАТЬ:

Вывод не печатается, потому что ваш веб-сервер может буферизовать содержимое. Попробуйте отключить буферизацию сжатия и вывода:

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

Также имейте в виду, что Safari и Internet Explorer имеют внутренний буфер 1K. Таким образом, вам нужно добавить 1 Кбайт заполняющих данных (например, пробелы), чтобы их визуализировать.

EDIT 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."%"; 

Вам нужен только ob_flush() если активен выходной буфер (например, ob_start() или настройками конфигурации). Если вы этого не сделали, просто удалите ob_flush() . Или вы можете сделать это условным:

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

Где ob_start ()?

ob_flush сбрасывает выходной буфер в дескриптор файла. Возможно, вы ошибаетесь.

Пример:

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

руководство