Буферизация вывода имеет свои преимущества и недостатки. Основное преимущество, очевидно, заключается в том, что вы можете буферизовать вывод, не вызывая заголовки ответа. Основным недостатком является то, что клиент будет ждать столько времени, сколько потребуется, чтобы заполнить выходной буфер или flu sh, прежде чем получить ответ от сервера. Это означает, что в это время конечный пользователь смотрит на пустой белый экран, пока это происходит. Это также может повлиять на некоторые метрики телеметрии в производственной среде, такие как TTFB ( Time To First Byte ) или рендеринг UA. Помните, что UA может на самом деле получать CSS, JS и другие активы в фоновом режиме, ожидая остальную часть HTML с сервера. Это известно как потоковая обработка . Большинство современных браузеров реализуют это, обрабатывая фрагменты DOM по мере их потоковой передачи, а не ожидая полного ответа, чтобы начать рендеринг страницы.
Именно поэтому большинство людей помещают свои CSS в <head>
раздел HTML, чтобы браузер сразу начал получать и собирать содержимое. В браузере механизм рендеринга выполняет раздельный анализ как CSS, так и HTML. HTML отправляется в анализатор DOM, а CSS - в анализатор CSS. Кроме того, JS переходит к механизму JS, но это может вызвать некоторые операции блокировки при рендеринге (именно поэтому большая часть JS обычно загружается в конце DOM, поскольку ему часто требуется доступ ко всей DOM).
Вот как браузер обычно отображает страницу в клиентском UA:
Поэтому иногда желательно отправить ответ клиенту как можно скорее, особенно в мобильных устройствах , где операции рендеринга часто медленнее, чем в настольных устройствах из-за аппаратных ограничений.
Рассмотрим сценарий, в котором вы делаете что-то похожее в своем коде:
<html>
<head>
<link rel="stylesheet" type="text/css" href="/your.css">
</head>
<body>
<h1>Title</h1>
<?php
$pdo = new PDO($dsn);
$data = $pdo->query(/* do complicated long-running query here */);
// This blocks further stream processing on the client-side here
// Then db result comes back and we continue printing
foreach ($data as $row) {
echo "$row[1], $row[2]...etc...";
}
?>
</body>
</html>
Частичная визуализация контента на стороне клиента важна для удобства пользователя. Хотя это может не относиться к вам конкретно, это обычно считается важным. Поэтому любая операция, которая может занять некоторое время на серверной части, предпочтительно должна быть отложена в пользу рендеринга как можно большего количества контента на стороне клиента.