Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выводится буфер без вызова ob_end_flush
 
 автор: ladan   (26.05.2012 в 14:16)   письмо автору
 
 

Добрый день, в справочнике сказано, что эта функция выводит содержимое внутреннего буфера (ob_start())

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


<?php    ob_start('compress_html');  ?>
<html>
 <body>
 <p>It's like comparing apples to oranges.</p>


<div>Hello!</div>                                       <div>Hey!</div>

 </body>
 </html>
<?
  
function compress_html($compress)

                {    
$i = array("#\r\n#","#\n#","#>\s*<#");      $ii = array("","","><");

                               return 
preg_replace($i$ii$compress);

                }

?>


Здесь я не указал ob_end_flush и все равно все правильно сработало, вырезались пробелы и переносы строк. Зачем тогда нужен ob_end_flush?

  Ответить  
 
 автор: cheops   (26.05.2012 в 15:58)   письмо автору
 
   для: ladan   (26.05.2012 в 14:16)
 

Хм... а у вас директива output_buffering часом не включена в php.ini?

  Ответить  
 
 автор: ladan   (26.05.2012 в 17:50)   письмо автору
 
   для: cheops   (26.05.2012 в 15:58)
 

Я на денвере проверяю, поставил в php.ini строку
output_buffering = 0
и не помогло... Скажите пожалуйста как отключить автоматическую буферизацию?

  Ответить  
 
 автор: cheops   (26.05.2012 в 20:35)   письмо автору
 
   для: ladan   (26.05.2012 в 17:50)
 

Она вообще-то и должна быть по умолчанию быть отключена, да и вы её явно отключили...

  Ответить  
 
 автор: ladan   (27.05.2012 в 00:15)   письмо автору
 
   для: cheops   (26.05.2012 в 20:35)
 

правильно ли я понимаю, что такой код:

<?php    ob_start('compress_html');  ?> 
<html> 
 <body> 
 <p>It's like comparing apples to oranges.</p> 


<div>Hello!</div>                                       <div>Hey!</div> 

 </body> 
 </html> 


не должен выводить содержимое страницы, пока я не укажу ob_end_flush? Запутался что-то

  Ответить  
 
 автор: cheops   (27.05.2012 в 00:28)   письмо автору
 
   для: ladan   (27.05.2012 в 00:15)
 

Вообще это явно нигде не оговаривается, но судя по всему PHP неявно сбрасывает буфер в конце работы. Судя по всему буфер не отдается только в том случае, если вы его явно извлекаете или сбрасываете.

  Ответить  
 
 автор: ladan   (27.05.2012 в 03:52)   письмо автору
 
   для: cheops   (27.05.2012 в 00:28)
 

спасибо! пойду еще читать пока не усвою. У вас вроде опетачка в статье http://www.softtime.ru/dic/id_dic=290&id_group=12


Эта функция очищает содержимое буф
ера вывода и отключает буферизацию вывода. Если необходимо далее поддерживать процесс буфериза
ции содержимого, следует вызвать ob_get_contents() перед ob_end_clean(), так как содержимое буфера уничтожается при вызове ob_end_flush(). Функция возвращает TRUE в случае успеха и FALSE в случае неудачи. Одной из основных причин не
удачного завершения работы функции - вызов её без активации буферизирования или в том случае если буфер не может быть уничтожен (специальный тип буфера).


Там где выделенном жирным. Наверно речь шла о ob_end_clean()?

  Ответить  
 
 автор: ladan   (27.05.2012 в 04:14)   письмо автору
 
   для: ladan   (27.05.2012 в 03:52)
 

bool ob_start ([ callable $output_callback 
[, int $chunk_size = 0 [, bool $erase = true ]]] )
Эта функция включает буферизацию вывода. Если буферизация 
вывода активна, вывод скрипта не высылается (кроме 
заголовков), а сохраняется во внутреннем буфере.

Значит:


<? ob_start(); ?>

привет

Выводится, а не должно вроде бы как!

Ну а если так:

<? ob_start(); ?>

привет

<?
ob_end_flush
();
?>


Что без ob_end_flush, что с ним, все равно все выводится. И не понятно для чего он... в php.ini и htacsess ничего не прописано, что связано с буфером(проверяю на денвере)


Единственное это:


<? ob_start(); ?>

привет

<? ob_end_clean(); ?>


Ничего не выводится, пока перед очисткой буфера его содержимое не поместить в переменную и затем вывести

<?
$page 
ob_get_contents();

ob_end_clean();

echo 
$page;

?>
? ob_end_clean(); ?

  Ответить  
 
 автор: cheops   (27.05.2012 в 08:20)   письмо автору
 
   для: ladan   (27.05.2012 в 04:14)
 

Да, все верно, это штатные поведения функций ob_end_flush() и ob_end_clean() - так и должно быть.

  Ответить  
 
 автор: cheops   (27.05.2012 в 08:18)   письмо автору
 
   для: ladan   (27.05.2012 в 03:52)
 

>Там где выделенном жирным. Наверно речь шла о ob_end_clean()?
Смотря, что делать хотите, вообще, ob_end_clean() должна уничтожить буфер без отдачи клиенту, а ob_end_flush() - вытолкнуть содержимое буфера клиенту и уничтожить буфер.

  Ответить  
 
 автор: ladan   (27.05.2012 в 11:34)   письмо автору
 
   для: cheops   (27.05.2012 в 08:18)
 

Спасибо, уже чуток суть происнилась :) А такой код:

<?
ob_start
();
?>

привет


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

  Ответить  
 
 автор: Sfinks   (27.05.2012 в 11:59)   письмо автору
 
   для: ladan   (27.05.2012 в 11:34)
 

Если не очистить буфер, то по завершении работы скрипта, буфер сбрасывается пользователю. Значит должен.

  Ответить  
 
 автор: ladan   (27.05.2012 в 21:47)   письмо автору
 
   для: Sfinks   (27.05.2012 в 11:59)
 

спасибо, теперь понятно!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования