首页 > 解决方案 > PHP:使用 output_buffering ON 有缺点吗?

问题描述

如果我在我的文件中设置output_bufferingon是否.htaccess有任何缺点。

我总是建议我的学生将其关闭,并确保您的代码不会在错误的时间输出空格,并且可能为了安全起见再次打开它。

该文档并没有真正说明您为什么会或不会使用此功能。其他 SO 问题讨论如何使用它,但不讨论它是否会导致其自身的问题。我知道如果 PHP 作为 CGI 运行,您将无法使用此功能。

标签: php.htaccessoutput-buffering

解决方案


输出缓冲有优点也有缺点。主要优点显然是您可以在不调用响应标头的情况下缓冲输出。主要缺点是客户端将等待填充输出缓冲区或刷新输出缓冲区,然后再接收来自服务器的响应。这意味着与此同时,最终用户在发生这种情况时正盯着一个空白的白色屏幕。这也可能会影响生产环境中的某些遥测指标,例如 TTFB(首字节时间)或 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>

在客户端部分呈现内容对用户体验很重要。尽管这对您而言可能并非如此,但通常被认为很重要。因此,任何可能在后端花费一些时间的操作都应该推迟,以便在客户端呈现尽可能多的内容。


推荐阅读