Ошибка PHP: ob_flush () [ref.outcontrol]: не удалось очистить буфер.Нет буфера для очистки - PullRequest
9 голосов
/ 07 февраля 2012

Может кто-нибудь сохранить эти 2 файла и запустить их и сказать мне, почему я получаю ошибку "ob_flush () [ref.outcontrol]: не удалось очистить буфер. Нет буфера для очистки". Я попытался погуглить, и он говорит, что я должен использовать 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>

Ответы [ 3 ]

18 голосов
/ 07 февраля 2012

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

 if( ob_get_level() > 0 ) ob_flush();
10 голосов
/ 07 февраля 2012

Я думаю, вы путаете 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 имеют внутренний буфер 1 КБ.Поэтому вам необходимо добавить 1 КБ данных заполнения (например, пробелов), чтобы они отображались.

РЕДАКТИРОВАТЬ 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."%";
1 голос
/ 07 февраля 2012

Где находится ob_start ()?

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

Пример:

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

руководство

...