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

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

<?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 ответа

Решение

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

Во-вторых, зачем мне нужно немного HTML посередине?

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

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

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

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

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

Ничего общего с заголовками здесь.

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

<?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();
?>
Другие вопросы по тегам