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() , он выдает сообщение об ошибке: «Не удается отправить ограничители кэша сеанса – уже отправленные заголовки».

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

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

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

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

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

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

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

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

Видя, как код использует функции буферизации вывода, я понятия не имею, почему они считают, что нужно попробовать и переполнить буфер 4kb (по умолчанию в стандартном 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(); ?>