php - PHP:使用 output_buffering ON 有缺点吗?
问题描述
如果我在我的文件中设置output_buffering
,on
是否.htaccess
有任何缺点。
我总是建议我的学生将其关闭,并确保您的代码不会在错误的时间输出空格,并且可能为了安全起见再次打开它。
该文档并没有真正说明您为什么会或不会使用此功能。其他 SO 问题讨论如何使用它,但不讨论它是否会导致其自身的问题。我知道如果 PHP 作为 CGI 运行,您将无法使用此功能。
解决方案
输出缓冲有优点也有缺点。主要优点显然是您可以在不调用响应标头的情况下缓冲输出。主要缺点是客户端将等待填充输出缓冲区或刷新输出缓冲区,然后再接收来自服务器的响应。这意味着与此同时,最终用户在发生这种情况时正盯着一个空白的白色屏幕。这也可能会影响生产环境中的某些遥测指标,例如 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>
在客户端部分呈现内容对用户体验很重要。尽管这对您而言可能并非如此,但通常被认为很重要。因此,任何可能在后端花费一些时间的操作都应该推迟,以便在客户端呈现尽可能多的内容。
推荐阅读
- python - Django:从 html 模板访问自定义模型字段的属性
- google-apps-script - 谷歌表单/谷歌表格删除选项脚本
- package - 无法在 Jupyter Notebook 中更新 Seaborn
- java - 为什么 Google 的 ML 人脸检测工具包在 .process() 上崩溃
- azure - Azure CLI 无法识别参数
- html - ASP.NET Core:将数据从一个表移动到另一个表
- html - 通过map React将参数传递给react中的组件
- angular - JavaScript堆内存不足Angular Heroku
- typescript - 如何使用对接口中属性的引用作为 TypeScript 中的类型?
- libpcap - 解析 pcapng 与 pcap 文件