PHP: Есть ли недостаток в использовании output_buffering ON? - PullRequest
2 голосов
/ 21 февраля 2020

Если я установлю output_buffering на on в моем файле .htaccess, есть ли какие-либо недостатки.

Я всегда рекомендую своим студентам отключить его и убедиться, что ваш код не работает. • не выводить пробелы в неподходящее время и, возможно, включить его снова, чтобы быть в безопасности.

Документация на самом деле не go о том, почему вы используете или не используете эту функцию. Другие вопросы SO обсуждают, как использовать это, но не вызывает ли это проблемы самостоятельно. Я знаю, что вы не можете использовать эту функцию, если PHP запущен как CGI.

1 Ответ

1 голос
/ 21 февраля 2020

Буферизация вывода имеет свои преимущества и недостатки. Основное преимущество, очевидно, заключается в том, что вы можете буферизовать вывод, не вызывая заголовки ответа. Основным недостатком является то, что клиент будет ждать столько времени, сколько потребуется, чтобы заполнить выходной буфер или 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:

rendering

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


Рассмотрим сценарий, в котором вы делаете что-то похожее в своем коде:

<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>

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

...