【发布时间】:2011-12-16 20:33:34
【问题描述】:
如果您转到主页,您会看到在页面加载之前,浏览器等待...
我怎样才能减少第一个字节的时间?
【问题讨论】:
标签: performance dns
如果您转到主页,您会看到在页面加载之前,浏览器等待...
我怎样才能减少第一个字节的时间?
【问题讨论】:
标签: performance dns
如果您不展示负责生成网站内容的代码,没有人可以给您详细的答案 - 因为这就是延迟所在。
但是,由于该站点使用的是 php,因此您很可能使用output buffering
鉴于这种情况,以下代码将给出(网络延迟 +)2 秒的 TTFB:
<?php ob_start(); ?>
<!doctype html>
<html>
<head>
<title>Slow to Load, Slow to finish</title>
</head>
<body>
<?php
sleep(2); // Simulate slow processing
echo "Body"
?>
</body>
</html>
而这将为您提供(网络延迟 +)0 秒的 TTFB:
<!doctype html>
<html>
<head>
<title>Fast to load, Slow to finish</title>
</head>
<body>
<?php ob_start(); ?>
<?php
sleep(2); // Simulate slow processing
echo "Body"
?>
</body>
</html>
在这两种情况下加载整个页面的时间是相同的 - 只是延迟发生了变化。如果您特别关注减少 TTFB(为什么),那应该为您提供足够的信息来进一步调查。
重要提示:在关注 TTFB 之前,您应该做很多 frontend changes。
【讨论】:
ob_start之前的第一个字节<?php echo ' '; ob_start(); ?>
<?php echo '<html' .... 更改为<html><?php echo '....'; ?> 对我产生了影响,我一直在 300 到 400 (不知道为什么),这个小小的改变使它现在是 90-146 ;)
我已经处理了 巨大的 TTFB(8-10 秒)并拼命寻找解决方案。在搜索和搜索没有任何成功后,我决定仔细查看我的 PHP 代码和数据库索引。
输出缓冲解决方案稍微降低了我的 TTFB,但还不够。我再次收到用户投诉。
真正的问题是服务器处理时间(DB 查询和 PHP 循环)和您生成的 HTML 源代码。
现在,我建议采取以下步骤:
在我的例子中,我返回了一个对象数组,并检查了我的主表的索引。一切看起来都不错,但我忘记了我的对象包括其他表中的其他较小对象。这些表没有正确索引。因此我的巨大TTFB。我只是将正确的索引添加到正确的表中,从 8 秒到 2 秒。
您可能有一些 loop in loop 处理起来可能很慢。您应该使用 PHP MVC 框架。你的选择。我不会说出任何名字。
避免这样的代码,即使它正在工作。我知道,一些 PHP4 程序员会说它很好。 :)
$query = "SELECT something FROM table";
$result = mysqli_query($mysqli, $query);
if($result) {
while($row = mysqli_fetch_assoc($result)) {
$query = "UPDATE other_table SET something_else = "'.$row['something'].'";
$result2 = mysqli_query($mysqli, $query)
}
}
例如,您通过 PHP 循环生成 Javascript 代码。逻辑没问题。加载时间不是。假设您将 100 行返回到一个表中。对于每一行,您只有 5 种可能的操作(更改状态、编辑、删除、复制、打印)。这意味着 5 个 jQuery 对话框(HTML div,带有控件)和 5 个 JS 脚本乘以 100 行 = 要在该页面上编写的数千行代码。 我的情况是,我的 4MB 的 HTML 代码超过 32.000 行。在我将所有这些对话框放在正确的 JS 函数上之后,从 2 秒到不到 1 秒。
总结,(如果你还在阅读这篇文章:))不要搜索一些神奇的函数来降低你的 TTFB。 搜索您的代码和数据库。
PS:其他一些有助于提高速度的东西:浏览器缓存和压缩,CDN 的使用,缩小 HTML、CSS 和 JS,延迟 JavaScript 解析,将图像组合成 CSS sprites 等。 使用 Google Page speed 和 Google Audits 获得更多性能建议。
【讨论】:
延迟是由生成索引页面的服务器端脚本引起的。
通过快速浏览您的网站,我可以猜测该网站使用的是 PHP。因此,延迟是由 index.php 脚本中包含的内容引起的。
主机、网络、硬件和 HTTP 服务器 (Apache) 绝对不是原因。您的图表显示静态文件(.css、.js 等)的交付速度相当快。
因此,对于更多细节,您应该提供更多信息(index.php 执行缓慢可能有许多不同的原因......)。
【讨论】:
.htaccess 中的错误也会大大增加 TTFB。
我不得不删除 Wordfence 留下的一些旧代码行来解决我的 8-12 秒 TTFB(现在是 500 毫秒)。
【讨论】:
我认为这取决于您使用什么工具来衡量此类数据。当我使用webpagetest.org - 第一个字节的时间是292 ms,这很好。或许您应该重新检查一下?
这个数字的一部分取决于您相对于服务器的位置 - 您必须做的跃点越多 - 这个数字就越大。它还与服务器硬件和连接性有关——通常这是您无法真正控制的。您可能想查看其他主机,但我会先进行更多测试 - 让您的朋友在 pagestest.org(或类似网站)上测试您的网站,看看他们得到什么值。
【讨论】:
可能最有效的解决方案是使用具有原生 HTML 缓存功能(静态和动态)的 CDN。 TTFB 依赖于您在源服务器上快速处理 HTML 的能力,您可以通过提供来自 CDN 的 新鲜 缓存副本来完全跳过处理时间。
我最近写了一篇关于它的帖子,其中研究了 TTFB 延迟因素和不同资源的平均加载时间(基于跨 1B 会话收集的数据)。您可能会发现它很有用: http://www.incapsula.com/the-incapsula-blog/item/809-using-cdn-to-improve-seo-and-ttfb
【讨论】:
您可以为 TTFB 使用 cloudflare 和 cdn 服务。如果您不接受适当的反馈,请更改您的主机服务器。
【讨论】: