Php delete all echo

ob_end_clean

Эта функция удаляет содержимое самого верхнего буфера вывода и отключает эту буферизацию. Если вы хотите использовать содержимое буфера, то вам необходимо вызвать ob_get_contents() перед ob_end_clean() , так как все содержимое буфера удаляется при вызове ob_end_clean() .

Буфер вывода должен запускаться функцией ob_start() с флагами PHP_OUTPUT_HANDLER_CLEANABLE и PHP_OUTPUT_HANDLER_REMOVABLE. Иначе не сработает ob_end_clean() .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Основной причиной неудачного завершения работы функции является её вызов без активного буфера или если буфер не может быть удалён (специальный тип буфера).

Ошибки

Если функция завершается ошибкой, генерируется E_NOTICE .

Примеры

Следующий пример показывает простой способ избавиться от всех выходных буферов:

Пример #1 Пример использования функции ob_end_clean()

Смотрите также

  • ob_start() — Включение буферизации вывода
  • ob_get_contents() — Возвращает содержимое буфера вывода
  • ob_flush() — Сбросить (отправить) буфер вывода

User Contributed Notes 12 notes

Note that if you started called ob_start with a callback, that callback will still be called even if you discard the OB with ob_end_clean.

Because there is no way of removing the callback from the OB once you’ve set it, the only way to stop the callback function from having any effect is to do something like:

$ignore_callback = false ;
ob_start ( ‘my_callback’ );
.
if( $need_to_abort ) $ignore_callback = true ;
ob_end_clean ();
.
>

Take note that if you change zlib output compression setting in between ob_start and ob_end_clean or ob_end_flush, you will get an error: ob_end_flush() failed to delete buffer zlib output compression

ini_set ( ‘zlib.output_compression’ , ‘1’ );

?>

ob_end_clean(); in this example will throw the error.

If there is no confidence about output buffering (enabled or not),
you may try these guards:

while ( ob_get_level () !== 0 ) ob_end_clean ();
>

while ( ob_get_length () !== false ) ob_end_clean ();
>

You might want to prevent your script from executing if the client already has the latest version.
You can do it like so:

$mtime=filemtime($_SERVER[«SCRIPT_FILENAME»])-date(«Z»);
$gmt_mtime = date(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’;

if(isset($headers[«If-Modified-Since»])) if ($headers[«If-Modified-Since»] == $gmt_mtime) header(«HTTP/1.1 304 Not Modified»);
ob_end_clean();
exit;
>
>

$size=ob_get_length();
header(«Last-Modified: «.$gmt_mtime);
header(«Content-Length: $size»);
ob_end_flush();

Instead of checking the If-Modified-Since-Header against the date of the last modification of the script, you can of course query a database or take any other date that is somehow related to the modification of the result of your script.

You can for instance use this technique to generate images dynamically. If the user indicates he already has a version of the image by the If-Modified-Since-Header, there’s no need to generate it and let the server finally discard it because the server only then interpretes the If-Modified-Since-Header.
This saves server load and shortens response-times.

Keep in mind that mrfritz379’s example (#49800) is just an example. You can achieve that example’s result in a more efficient manner without using output buffering functions:

echo «

Search running. Please be patient. . .»;
$output = «

FileList:

\n»;
if (is_dir($dir)) $dh = opendir($dir);

while (($fd = readdir($dh)) != false) echo » .»;
$output .= $fd;
>
>
echo «
Search Complete!

\n»;
echo $output;

In addition to John Smith’s comment (#42939), ob_gzhandler() may still set the HTTP header «Content-Encoding» to «gzip» or «deflate» even if you call ob_end_clean(). This will cause a problem in the following situation:

1. Call ob_gzhandler().
2. Echo «Some content»;
3. Call ob_end_clean().
4. Echo «New content»;

In the above case, the browser may receive the «Content-Encoding: gzip» HTTP header and attempts to decompress the uncompressed «New content». The browser will fail.

In the following situation, this behaviour will go unnoticed:

1. Call ob_gzhandler().
2. Echo «Some content»;
3. Call ob_end_clean().
4. Call ob_gzhandler().
5. Echo «New content»;

This is because the second ob_gzhandler() will mask the absence of the first ob_gzhandler().

A solution would be to write a wrapper, like John Smith did, for the ob_gzhandler().

Источник

Как очистить выходные данные после каждого вызова echo?

У меня есть php-скрипт, который только производит журналы для клиента.
Когда я что-то повторяю, я хочу, чтобы он был передан клиенту «на лету».
(Поскольку во время обработки скрипта страница пуста)
Я уже играл с ob_start() и ob_flush() , но они не работали.

PS: немного грязно положить флеш в конце echo звонка …

EDIT: Ни ответы не работали, ни PHP, ни Apache Fault?

Редактировать:

Я читал комманды на странице руководства и наткнулся на ошибку, в которой указано, что ob_implicit_flush не работает, и ob_implicit_flush является следующее:

ob_end_flush(); # CODE THAT NEEDS IMMEDIATE FLUSHING ob_start(); 

Что может даже произойти, так это то, что клиент не получает пакет с сервера, пока сервер не создаст достаточно символов для отправки того, что он считает отправкой пакета.

Старый ответ:

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

ob_implicit_flush(true); # CODE THAT NEEDS IMMEDIATE FLUSHING ob_implicit_flush(false); 

Я получил ту же проблему, и один из опубликованных примеров в руководстве работал. Набор символов должен быть указан как один из плакатов, о которых уже упоминалось. http://www.php.net/manual/en/function.ob-flush.php#109314

header( 'Content-type: text/html; charset=utf-8' ); echo 'Begin . 
'; for( $i = 0 ; $i < 10 ; $i++ ) < echo $i . '
'; flush(); ob_flush(); sleep(1); > echo 'End .
';

Флеш не работал бы с помощью apache mod_gzip или gzip от Nginx, потому что, по логике, это gzipping содержимое, и для этого он должен буферизовать контент, чтобы его gzip. Любой вид gzipping веб-сервера повлияет на это. Короче говоря, на стороне сервера нам нужно отключить gzip и уменьшить размер буфера fastcgi. Так:

output_buffering = Off zlib.output_compression = Off 
gzip off; proxy_buffering off; 

Также имейте эти строки под рукой, особенно если у вас нет доступа к php.ini:

@ini_set('zlib.output_compression',0); @ini_set('implicit_flush',1); @ob_end_clean(); set_time_limit(0); 

Наконец, если у вас есть это, прокомментируйте приведенный ниже код:

ob_start('ob_gzhandler'); ob_flush(); 

Код проверки PHP:

ob_implicit_flush(1); for ($i=0; $i 

Попытка, по-видимому, не работающая, является побочным эффектом автоматического обнаружения набора символов.

Браузер ничего не отобразит, пока не узнает набор символов для его отображения, и если вы не укажете набор символов, ему нужно попытаться угадать его. Проблема заключается в том, что он не может сделать хорошее предположение без достаточного количества данных, поэтому браузеры, похоже, имеют этот 1024-байтовый (или подобный) буфер, который им нужно заполнить перед отображением чего-либо.

Поэтому решение состоит в том, чтобы убедиться, что браузеру не нужно угадывать набор символов.

Если вы отправляете текст, добавьте ‘; charset = utf-8 ‘для своего типа содержимого, а если это HTML, добавьте набор символов в соответствующий метатег.

то, что вы хотите, это метод флеша . пример:

Почему бы не сделать функцию для эха, например:

Правильная функция для использования – flush() .

   

Hello! I am waiting for the next message.
I am the next message!
And I am the last message. Good bye.

Обратите внимание, что с IE существует «проблема», которая выводит только очищенный контент, когда он составляет не менее 256 байт, поэтому ваша первая часть страницы должна быть не менее 256 байт.

У меня было похожее дело. С помощью

// ini_set("output_buffering", 0); // off ini_set("zlib.output_compression", 0); // off ini_set("implicit_flush", 1); // on 

действительно делал промывку вывода частой в моем случае.

Но мне нужно было очистить выход прямо в определенной точке (в цикле, который я запускаю), поэтому используя оба

Мне не удалось отключить «output_buffering» с помощью ini_set (…), пришлось повернуть его прямо в php.ini, phpinfo () показывает, что его значение «нет значения» при выключении, это нормально? ,

while (@ob_end_flush()); ob_implicit_flush(true); echo "first line visible to the browser"; echo "
"; sleep(5); echo "second line visible to the browser after 5 secs";

Просто обратите внимание, что таким образом вы фактически отключите выходной буфер для вашего текущего скрипта. Я думаю, вы можете повторно использовать его с ob_start () (я не уверен).

Важно то, что, отключив выходной буфер, как описано выше, вы больше не сможете перенаправлять свой php-скрипт с помощью функции header() , поскольку php может отправляться только один раз для заголовков HTTP-скриптов. Однако вы можете перенаправить с помощью javascript. Просто позвольте вашему сценарию php эхом следовать строкам, когда дело доходит до этого:

 echo ''; echo ''; exit; 

Антивирусное программное обеспечение также может мешать промывке продукта. В моем случае Антивирус Касперского 2013 года хранил куски данных перед отправкой в ​​браузер, хотя я использовал принятое решение.

Иногда проблема возникает из настроек Apache. Apache может быть настроен на gzip вывод. В файле .htaccess вы можете добавить, например:

Обратите внимание, что если вы находитесь на определенных общедоступных сайтах хостинга, таких как Dreamhost, вы не можете отключить буферизацию вывода PHP вообще, не пройдя разные маршруты:

Изменение кеша выходного буфера Если вы используете PHP FastCGI, функции PHP flush (), ob_flush () и ob_implicit_flush () не будут функционировать должным образом. По умолчанию вывод буферизуется на более высоком уровне, чем PHP (в частности, модулем Apache mod_deflate, который похож по форме / функции на mod_gzip).

Если вам нужен небуферизованный вывод, вы должны либо использовать CGI (вместо FastCGI), либо обратиться в службу поддержки, чтобы запросить, чтобы mod_deflate был отключен для вашего сайта.

Я опаздываю на обсуждение, но я читал, что многие люди говорят, что добавляет flush (); в конце каждого кода выглядит грязным, и они правы.

Лучшее решение – отключить deblate, gzip и всю буферизацию от Apache, промежуточных обработчиков и PHP. Затем в вашем php.ini вы должны:

 output_buffering = Off zlib.output_compression = Off implicit_flush = Off 

Временное решение заключается в том, чтобы иметь это в php.ini, если вы можете решить свою проблему с помощью flush (); но вы думаете, что это грязно и уродливо, чтобы его повсюду.

Если вы только указали это в своем php.ini, вам не нужно ставить flush (); в вашем коде больше.

Это мой код: (работа для PHP7)

private function closeConnection() < @apache_setenv('no-gzip', 1); @ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1); ignore_user_abort(true); set_time_limit(0); ob_start(); // do initial processing here echo json_encode(['ans' =>true]); header('Connection: close'); header('Content-Length: ' . ob_get_length()); ob_end_flush(); ob_flush(); flush(); > 

Источник

Читайте также:  Java log errors to file
Оцените статью