【问题标题】:How to reduce the "Time for the first byte" on my website?如何减少我网站上的“第一个字节的时间”?
【发布时间】:2011-12-16 20:33:34
【问题描述】:

如果您转到主页,您会看到在页面加载之前,浏览器等待...

我怎样才能减少第一个字节的时间

【问题讨论】:

    标签: performance dns


    【解决方案1】:

    如果您不展示负责生成网站内容的代码,没有人可以给您详细的答案 - 因为这就是延迟所在。

    但是,由于该站点使用的是 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

    【讨论】:

    • 尽快输出头部,可以获得很大的性能提升。如果您的头部包含 css 文件或脚本(即使它不应该),则浏览器可能会并行这些下载。如果浏览器必须等待解析文档,它甚至不知道它可以下载什么。
    • 发送ob_start之前的第一个字节&lt;?php echo ' '; ob_start(); ?&gt;
    • 哇!!!!从&lt;?php echo '&lt;html' .... 更改为&lt;html&gt;&lt;?php echo '....'; ?&gt; 对我产生了影响,我一直在 300 到 400 (不知道为什么),这个小小的改变使它现在是 90-146 ;)
    【解决方案2】:

    我已经处理了 巨大的 TTFB(8-10 秒)并拼命寻找解决方案。在搜索和搜索没有任何成功后,我决定仔细查看我的 PHP 代码和数据库索引

    输出缓冲解决方案稍微降低了我的 TTFB,但还不够。我再次收到用户投诉。

    真正的问题是服务器处理时间(DB 查询和 PHP 循环)您生成的 HTML 源代码

    现在,我建议采取以下步骤:

    1. 查看数据库索引。确保为您返回的“所有数据”使用正确的索引。使用Explain 验证是否使用了您的索引,使用了哪个索引以及如何使用它。

    在我的例子中,我返回了一个对象数组,并检查了我的主表的索引。一切看起来都不错,但我忘记了我的对象包括其他表中的其他较小对象。这些表没有正确索引。因此我的巨大TTFB。我只是将正确的索引添加到正确的表中,从 8 秒到 2 秒。

    1. 看看你的 PHP 代码。

    您可能有一些 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)
        }
    }
    
    1. 注意生成的 HTML 代码

    例如,您通过 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 获得更多性能建议。

    【讨论】:

    • 同样适用于其他模板引擎。例如,当使用 JSP 时,在 Tomcat 从 JSP 文件创建结果 HTML 输出之前,浏览器将看不到它的第一个字节。
    【解决方案3】:

    延迟是由生成索引页面的服务器端脚本引起的。

    通过快速浏览您的网站,我可以猜测该网站使用的是 PHP。因此,延迟是由 index.php 脚本中包含的内容引起的。

    主机、网络、硬件和 HTTP 服务器 (Apache) 绝对不是原因。您的图表显示静态文件(.css、.js 等)的交付速度相当快。

    因此,对于更多细节,您应该提供更多信息(index.php 执行缓慢可能有许多不同的原因......)。

    【讨论】:

      【解决方案4】:

      .htaccess 中的错误也会大大增加 TTFB。

      我不得不删除 Wordfence 留下的一些旧代码行来解决我的 8-12 秒 TTFB(现在是 500 毫秒)。

      【讨论】:

      • 这对我来说就是这样。我有一个错误的 .htaccess 文件,它使我的 TTFB 增加了 1000 毫秒。
      • 您能分享一下您所做的更改吗?
      【解决方案5】:

      我认为这取决于您使用什么工具来衡量此类数据。当我使用webpagetest.org - 第一个字节的时间是292 ms,这很好。或许您应该重新检查一下?

      这个数字的一​​部分取决于您相对于服务器的位置 - 您必须做的跃点越多 - 这个数字就越大。它还与服务器硬件和连接性有关——通常这是您无法真正控制的。您可能想查看其他主机,但我会先进行更多测试 - 让您的朋友在 pagestest.org(或类似网站)上测试您的网站,看看他们得到什么值。

      【讨论】:

        【解决方案6】:

        可能最有效的解决方案是使用具有原生 HTML 缓存功能(静态和动态)的 CDN。 TTFB 依赖于您在源服务器上快速处理 HTML 的能力,您可以通过提供来自 CDN 的 新鲜 缓存副本来完全跳过处理时间。

        我最近写了一篇关于它的帖子,其中研究了 TTFB 延迟因素和不同资源的平均加载时间(基于跨 1B 会话收集的数据)。您可能会发现它很有用: http://www.incapsula.com/the-incapsula-blog/item/809-using-cdn-to-improve-seo-and-ttfb

        【讨论】:

        • 什么是“原生 HTML 缓存功能”?我能找到的对该术语的唯一参考是您在 Stack overflow =) 上的两个答案。
        • 我的措辞可能很糟糕。 :) 我只是说它可以默认进行静态和动态缓存。
        • 这些术语在没有解释的情况下被扔掉并没有多大意义。我假设静态意味着“正常”,即 CDN 只是尊重缓存过期标头,而动态意味着例如cdn 认识到响应没有改变,忽略任何相关的缓存头和缓存,并在后端请求获取内容的新副本时立即提供缓存的结果(替换缓存的副本以供将来的请求) - 即类似于varnish's grace mechanism
        • ...但无论如何,我不太喜欢分发“使用 CDN”股票建议来解决任何和所有前端性能问题。 CDN 通常是解决方案的一部分——它不是用来代替解决网站运行缓慢的原因的灵丹妙药。这类似于问:“我如何驾驶飞机?” A:“只要使用自动驾驶仪。” - 它可能“有效”,但没有人能以这种方式学到任何东西。
        • 在我的帖子中,我写道:“事实上,10 个 CDN 中有 9 个实际上会导致延迟——而不是促进解决方案……”我不认为 CDN 是灵丹妙药。离它很远(很远)。
        【解决方案7】:

        您可以为 TTFB 使用 cloudflare 和 cdn 服务。如果您不接受适当的反馈,请更改您的主机服务器。

        【讨论】:

        • 请详细说明什么是 cloudflare 和 cdn 服务以及它们的作用。以及他们如何解决相关问题。请同时提供链接 - 但不要将此作为“仅链接的答案”。
        猜你喜欢
        • 2015-05-29
        • 2016-09-28
        • 2018-12-04
        • 2021-07-16
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多