PHP:使用output_buffering ON是否有缺点?

问题描述 投票:1回答:1

如果我在output_buffering文件中将on设置为.htaccess,是否有任何不利之处。

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

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

php .htaccess output-buffering
1个回答
-1
投票

输出缓冲具有优点和缺点。显然,主要优点是您可以在不调用响应头的情况下缓冲输出。主要的缺点是,客户端将在接收到服务器的响应之前,等待填充输出缓冲区或刷新输出缓冲区的时间。这意味着在这种情况下,最终用户同时盯着黑屏。这也可能会影响生产环境中的某些遥测指标,例如TTFB(第一字节的时间)或UA渲染。请记住,UA实际上可以在后台获取CSS,JS和其他资源,同时等待来自服务器的HTML其余部分。这称为流处理。大多数现代浏览器通过处理DOM流中的DOM块来实现此目的,而不是等待整个响应开始呈现页面。

这就是为什么大多数人将他们的CSS放在HTML的<head>部分中,以使浏览器立即开始获取并构建内容接收器的原因。在浏览器中,渲染引擎对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>

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

© www.soinside.com 2019 - 2024. All rights reserved.