2011-12-16 62 views

回答

15

沒有你顯示負責生成網站內容的代碼,沒有人可以給你一個詳細的答案 - 因爲那是延遲的地方。

然而,由於該網站使用PHP,你是最有可能使用output buffering

鑑於這種情況,下面的代碼將給予(網絡延遲+)2S一個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> 

加載整個頁面的時間是在兩種情況下是相同的 - 只有在延遲爲c hanges。如果你專注於減少TTFB(爲什麼),那應該會給你足夠的信息來進一步調查。

重要:有很多frontend changes你應該在專注於TTFB之前作出。

+1

儘快輸出頭部,可以獲得很大的性能提升。如果您的頭部包含css文件或腳本(儘管它不應該),那麼瀏覽器可以與這些下載並行。如果瀏覽器必須等待解析文檔,它甚至不知道它可以下載什麼。 –

+1

在'ob_start'' <?php echo''之前發送第一個字節; ob_start(); ?> – ar099968

3

延遲是由產生的索引頁的服務器端腳本引起的。

通過快速瀏覽您的網站,我可以猜測該網站正在使用PHP。所以,延遲是由index.php腳本中包含的內容引起的。

主機,網絡,硬件和HTTP服務器(Apache)絕對不是原因。您的圖表顯示靜態文件(.css,.js等)交付速度相當快。

所以,更多的細節你應該提供更多的信息(index.php的執行速度很慢可能有很多不同的原因......)。

0

我認爲這取決於你用什麼工具來衡量這類數據。當我使用webpagetest.org時 - 第一個字節的時間是292毫秒,這很好。也許你應該重新運行你的支票?

這個數字的一​​部分取決於你與服務器的關係 - 你必須做的越多 - 這個數字越大。這也是關於服務器硬件和連接 - 通常這是你無法控制的。您可能希望查看其他主機,但我會先運行一些測試 - 讓您的朋友在webpagetest.org(或類似網站)上測試您的網站,並查看他們獲得的值。

-1

可能最有效的解決方案是使用具有本機HTML緩存功能(靜態和動態)的CDN。 TTFB依賴於您在原始服務器上快速處理HTML的能力,您可以通過向CDN提供新鮮的緩存副本,完全跳過處理時間。

我最近寫了一篇關於TTFB延遲因素和不同資源平均加載時間的報告(基於1B會話中收集的數據)。您可能會發現它很有用: http://www.incapsula.com/the-incapsula-blog/item/809-using-cdn-to-improve-seo-and-ttfb

+0

什麼是「原生HTML緩存功能」?我能找到的這個術語的唯一參考資料是堆棧溢出=)的兩個答案。 – AD7six

+0

可能是我的錯誤措辭。 :) 我只是說它可以做靜態和動態緩存爲默認。 –

+0

這些術語在沒有解釋的情況下扔掉沒有多大意義。我假定靜態意味着「正常」,即CDN只是承認緩存過期標題,而動態的意思是例如cdn認識到響應不會改變,忽略任何相關的緩存頭並緩存,並在後端立即提供緩存結果,請求獲取內容的新副本(替換未來請求的緩存副本) - 即類似於[清漆的寬限機制](https://www.varnish-software.com/static/book/Saving_a_request.html#core-grace-mechanisms)。 – AD7six

-2

您可以使用TTFB的cloudflare和cdn服務。如果你沒有采取適當的反饋改變你的主機服務器。

+1

請詳細說明一下cloudflare和cdn服務是什麼以及它們的功能。他們如何解決有問題的問題。還請提供鏈接 - 但不要將其作爲「僅鏈接答案」。 – TobiMcNamobi

3

我已經處理了巨大的TTFB(8-10秒)並拼命尋找解決方案。經過搜索和搜索沒有任何成功,我決定仔細看看我的PHP代碼和數據庫索引

輸出緩衝解決方案降低我的TTFB有點但不夠。我再次有用戶投訴。

真正的問題是服務器處理時間(DB查詢和PHP環路)和你產生的HTML源代碼。

現在,我建議採取以下步驟:

  1. 看看數據庫索引。請確保您使用「所有數據」的適當索引,您將返回。使用Explain來驗證您的索引是否被使用,使用哪一個以及如何使用它。

在我的情況下,我返回一個對象數組,我檢查了我的主表的索引。所有看起來不錯,但我忘記了我的對象包括其他表中的其他小對象。這些表格未正確編制索引。因此,我的巨大TTFB。我只是從8秒通過2秒,只是我正確的索引添加到正確的表。

  1. 看看你的PHP代碼。

您可能必須在循環一些環能是緩慢的過程。您應該使用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) 
    } 
} 
  • ,請注意生成的HTML代碼
  • 例如,你通過PHP循環生成Javascript代碼。邏輯是好的。加載時間不是。假設您將100行返回到表中。對於每一行,您只有5個可能的操作(更改狀態,編輯,刪除,複製,打印)。這意味着5個jQuery對話框(包含控件的HTML div)和5個JS腳本乘以100行=數千行代碼將寫入該頁面。 我的情況,我的HTML代碼4MB超過32.000行。在將所有這些對話框放在正確的JS函數後,從2秒到1秒以下。

    結論,(如果你還在讀這:) :)不要搜索一些神奇的功能,以減少你的TTFB。 搜索您的代碼和數據庫。

    PS:有些其他的事情將有助於提速:瀏覽器緩存和壓縮,使用CDN的,壓縮HTML,CSS和JS,推遲的JavaScript解析,結合圖像到CSS等 使用谷歌網頁速度,谷歌審計更多的性能建議。

    1

    .htaccess中的錯誤也可以大大增加TTFB。

    我不得不刪除Wordfence留下的一些舊行代碼來解決我的8-12秒TTFB(現在500毫秒)。

    +0

    這就是它對我的。我有一個糟糕的.htaccess文件,使我的TTFB增加了1000毫秒。 – Ken

    相關問題