У меня есть несколько концептуальных вопросов (все связанные, я думаю) относительно следующего сценария, в комментариях. Скрипт отлично работает.
<?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(); ?>