2011-12-16 32 views

Trả lời

15

Không ai có thể cung cấp cho bạn câu trả lời chi tiết mà không cần bạn hiển thị mã chịu trách nhiệm tạo nội dung của trang web - vì đó là nơi trì hoãn.

Tuy nhiên, kể từ khi trang web được sử dụng php, bạn có nhiều khả năng sử dụng output buffering

Cho rằng là trường hợp, các mã sau đây sẽ cung cấp cho một TTFB của (độ trễ mạng +) 2s:

<?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> 

trong khi đó, điều này sẽ cung cấp cho bạn một TTFB của (độ trễ mạng +) 0s:

<!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> 

thời gian để tải toàn bộ trang là như nhau trong cả hai trường hợp - duy nhất mà sự trì hoãn là c hanges. Nếu bạn tập trung cụ thể vào việc giảm TTFB (tại sao), điều đó sẽ cung cấp cho bạn đủ thông tin để điều tra thêm.

QUAN TRỌNG: Có rất nhiều frontend changes bạn nên thực hiện trước khi tập trung vào TTFB.

+1

Xuất đầu càng sớm càng tốt, có thể đạt được hiệu suất lớn. Nếu đầu của bạn chứa tệp css hoặc tập lệnh (mặc dù nó không nên), thì trình duyệt có thể song song với các tải xuống đó. Nếu trình duyệt phải đợi để phân tích cú pháp tài liệu, nó thậm chí không biết nó có thể được tải xuống. –

+1

gửi byte đầu tiên trước 'ob_start'' ' – ar099968

3

Sự chậm trễ là do tập lệnh phía máy chủ tạo trang chỉ mục.

Bằng cách xem nhanh trang web của bạn, tôi có thể đoán rằng trang web đang sử dụng PHP. Vì vậy, sự chậm trễ là do một cái gì đó chứa trong kịch bản index.php của bạn.

Máy chủ lưu trữ, mạng, phần cứng và máy chủ HTTP (Apache) chắc chắn KHÔNG phải là nguyên nhân. Biểu đồ của bạn cho thấy các tệp tĩnh (.css, .js và vv) được phân phối khá nhanh.

Vì vậy, để biết thêm chi tiết, bạn nên cung cấp thêm thông tin (việc thực hiện chậm index.php có thể có nhiều lý do khác nhau ...).

0

Tôi nghĩ điều đó phụ thuộc vào công cụ bạn sử dụng để đo loại dữ liệu này. Khi tôi sử dụng webpagetest.org - thời gian để byte đầu tiên là 292 ms là tốt. Có lẽ bạn nên chạy lại kiểm tra của bạn?

Một phần của số này nằm xuống nơi bạn đang có liên quan đến máy chủ - bạn càng phải thực hiện nhiều bước nhảy - con số này càng lớn. Nó cũng liên quan đến phần cứng và kết nối của máy chủ - thường là điều bạn không thể kiểm soát được. Bạn có thể muốn xem xét các máy chủ khác, nhưng trước tiên tôi sẽ chạy một vài thử nghiệm khác - giúp bạn bè của bạn kiểm tra trang web của bạn trên webpagetest.org (hoặc tương tự) và xem những giá trị nào họ nhận được.

-1

Có lẽ giải pháp hiệu quả nhất là sử dụng CDN với khả năng lưu trữ HTML gốc (tĩnh và động). TTFB dựa vào khả năng xử lý nhanh HTML của bạn trên máy chủ gốc, bạn có thể bỏ qua thời gian xử lý hoàn toàn bằng cách phân phối bản sao được lưu trong bộ nhớ cache mới từ CDN.

Gần đây tôi đã viết một bài đăng về nó, xem xét các yếu tố trì hoãn TTFB và thời gian tải trung bình của các tài nguyên khác nhau (dựa trên dữ liệu được thu thập trong các phiên 1B). Bạn có thể thấy hữu ích: http://www.incapsula.com/the-incapsula-blog/item/809-using-cdn-to-improve-seo-and-ttfb

+0

" Khả năng lưu bộ nhớ cache HTML gốc "là gì? Các tài liệu tham khảo duy nhất tôi có thể tìm thấy thuật ngữ đó là hai câu trả lời của bạn ở đây trên Stack overflow =). – AD7six

+0

Có lẽ là một phần xấu trong phần của tôi. :) Tôi chỉ có nghĩa là nó có thể làm bộ nhớ đệm tĩnh và động được mặc định. –

+0

Những thuật ngữ này không có nghĩa là nhiều khi ném xung quanh mà không cần giải thích. Tôi giả sử tĩnh có nghĩa là "bình thường" nghĩa là CDN chỉ đơn giản là tôn trọng tiêu đề hết hạn bộ nhớ cache và phương tiện động, ví dụ: cdn nhận ra rằng phản hồi không thay đổi, bỏ qua bất kỳ tiêu đề bộ nhớ cache và bộ nhớ đệm có liên quan nào và phân phối kết quả được lưu trong bộ nhớ cache ngay lập tức trong khi trong chương trình phụ trợ yêu cầu lấy bản sao nội dung mới (thay thế bản sao được lưu trong bộ nhớ cache cho các yêu cầu trong tương lai) - tức là tương tự như [cơ chế ân sủng của véc ni] (https://www.varnish-software.com/static/book/Saving_a_request.html#core-grace-mechanisms). – AD7six

-2

bạn có thể sử dụng dịch vụ đám mây và CDN cho TTFB. Nếu bạn không có phản hồi thích hợp, hãy thay đổi máy chủ lưu trữ của bạn.

+1

Vui lòng giải thích thêm một chút về dịch vụ cloudflare và cdn là gì và chúng làm gì. Và cách họ giải quyết vấn đề được đề cập. Cũng cung cấp liên kết, vui lòng - nhưng không làm cho điều này là "liên kết chỉ trả lời". – TobiMcNamobi

3

Tôi đã xử lý TTFB lớn (8-10 giây) và đang tìm kiếm một giải pháp tuyệt vọng. Sau khi tìm kiếm và tìm kiếm không thành công, tôi quyết định xem xét kỹ hơn mã PHP và chỉ mục cơ sở dữ liệu của mình.

Giải pháp bộ đệm đầu ra đầu ra giảm TTFB của tôi xuống một chút nhưng không đủ. Tôi đã có khiếu nại người dùng một lần nữa.

Vấn đề thực sự là thời gian xử lý máy chủ (truy vấn DB và vòng lặp PHP) và nguồn HTML bạn đã tạo.

Bây giờ, tôi đề nghị đưa các bước sau:

  1. Hãy nhìn vào các chỉ số cơ sở dữ liệu. Đảm bảo bạn sử dụng các chỉ mục thích hợp cho "tất cả dữ liệu" bạn trả lại. Sử dụng Explain để xác minh xem chỉ mục của bạn đã được sử dụng chưa, chỉ mục nào được sử dụng và cách sử dụng nó.

Trong trường hợp của mình, tôi trả về một mảng đối tượng và tôi đã kiểm tra chỉ mục của mình cho bảng chính. Tất cả nhìn OK nhưng tôi quên rằng đối tượng của tôi bao gồm các đối tượng nhỏ hơn từ các bảng khác. Các bảng này không được lập chỉ mục đúng cách. Do đó TTFB lớn của tôi. Tôi chỉ cần vượt qua từ 8 giây đến 2 giây chỉ cần thêm chỉ mục thích hợp vào các bảng bên phải.

  1. Hãy xem mã PHP của bạn.

Bạn có thể có một số vòng lặp vòng lặp có thể xử lý chậm. Bạn nên sử dụng một khung công tác PHP MVC. Lựa chọn của bạn. Tôi sẽ không nêu tên.

Tránh mã như vậy ngay cả khi nó đang hoạt động. Tôi biết, một số lập trình viên PHP4 sẽ nói nó là tốt. :)

$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) 
    } 
} 
    chú ý
  1. Pay đến tạo HTML code.

Ví dụ: bạn tạo mã Javascript qua vòng lặp PHP. Logic là OK. Thời gian tải không. Giả sử bạn trả lại 100 hàng vào một bảng. Đối với mỗi hàng bạn chỉ có 5 hành động có thể (thay đổi trạng thái, chỉnh sửa, xóa, sao chép, in). Điều đó có nghĩa là 5 hộp thoại jQuery (HTML div, với điều khiển) và 5 kịch bản JS nhân với 100 hàng = hàng nghìn dòng mã được viết trên trang đó. Trường hợp của tôi, hơn 32.000 dòng trên mã HTML 4MB của tôi. Chỉ cần thông qua từ 2 giây đến dưới 1 giây sau khi tôi đã đặt tất cả các hộp thoại này vào các hàm JS thích hợp.

Trong kết luận, (nếu bạn vẫn đọc nội dung này :)) không tìm kiếm một số chức năng ma thuật để giảm TTFB của bạn. Tìm kiếm mã của bạn và cơ sở dữ liệu của bạn.

PS: Một số điều khác sẽ giúp cho tốc độ tăng: bộ nhớ đệm trình duyệt và nén, sử dụng CDN, HTML giảm bớt, CSS và JS, hoãn phân tích cú pháp của JavaScript, kết hợp hình ảnh vào CSS sprites, vv Sử dụng Google Page tốc độ và Kiểm tra của Google để có thêm đề xuất về hiệu suất.

1

Lỗi trong .htaccess cũng có thể làm tăng đáng kể TTFB.

Tôi đã phải xóa một số dòng mã cũ còn lại bởi Wordfence để giải quyết TTFB 8-12 giây của tôi (hiện nay là 500ms).

+0

Đây là những gì nó đã cho tôi. Tôi đã có một tập tin .htaccess xấu làm tăng TTFB của tôi lên 1000ms. – Ken

Các vấn đề liên quan