PHP буфер почему \ r \ n - PullRequest
       32

PHP буфер почему \ r \ n

3 голосов
/ 16 ноября 2010

У меня есть несколько концептуальных вопросов (все связанные, я думаю) относительно следующего сценария, в комментариях.Скрипт работает отлично.

<?PHP
ob_start();

// Create string to overflow browser buffer ...?
$buffer = str_repeat(" ", 4096);

// Indicate new header / html content ...?
$buffer .= "\r\n<span></span>\r\n";

for ($i=0; $i<5; $i++) {
  echo $buffer.$i;
  ob_flush();
  flush();
  sleep(1);
}

ob_end_flush();
?>

Во-первых, зачем мне отправлять \r\n<tag>\r\n в браузер?Я предполагаю, что это как-то связано с заголовками.

Во-вторых, зачем мне какой-то HTML в середине?

В-третьих, есть много примеров, в которых 256 байтов вместо 4096. Однакоскрипт не работает, если я использую 256. Являются ли эти примеры устаревшими, и будет ли этот номер снова изменяться в будущем?

// РЕДАКТИРОВАТЬ ОТНОСИТЕЛЬНО ССЫЛКИ ИСТОЧНИКА

Этот код был получен в основном из комментарий в php.net sleep() функция и решение этого SO вопроса .Ни в одном из них не упоминается, почему включить \r\n.

// РЕДАКТИРОВАТЬ ПО ЗАГОТОВКЕ

Если я не добавлю \r\n, HTML-тег и второй набор \r\n,Скрипт не будет работать должным образом в Chrome или Safari (он просто сбрасывает все значения сразу).

Кроме того, если он вызывается до session_start(), выдается сообщение об ошибке: «Не удается отправить ограничитель кэша сеанса - заголовки уже отправлены».

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

Во-первых, зачем мне отправлять \r\n<tag>\r\n в браузер? Я предполагаю, что это как-то связано с заголовками.

Во-вторых, зачем мне какой-то HTML в середине?

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

И здесь этот HTML-фрагмент может быть инициатором для браузера, чтобы фактически построить DOM и начать рендеринг.

В-третьих, есть много примеров, в которых 256 байтов вместо 4096. Однако, если я использую 256., скрипт не будет работать. Являются ли эти примеры устаревшими, и изменится ли это число снова в будущем?

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

1 голос
/ 16 ноября 2010

Причиной использования \r\n было бы правильное отображение вывода при просмотре с использованием средства просмотра исходного кода Windows, например notepad.exe.

. Ничего общего с заголовками здесь не имеет.код использует функции буферизации вывода, я понятия не имею, почему они чувствуют необходимость переполнения буфера 4 КБ (по умолчанию в стандартном php.ini, хотя больше специалистов предпочли бы не использовать буферизацию вывода по умолчанию).

0 голосов
/ 30 июня 2014
<?php

if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

        echo "<br> Line to show.";
        echo str_pad('',4096)."\n";    

        ob_flush();
        flush();
        sleep(2);
}

echo "Done.";

ob_end_flush();
?>
...