Tắt bộ nhớ đệm của phần tử trang. HTTP caching

Mô tả bộ nhớ đệm. Giải quyết sự cố với các trình duyệt khác nhau và mô tả tiêu đề phản hồi của máy chủ chịu trách nhiệm lưu vào bộ nhớ đệm.

Quản trị viên web thường phải đối mặt với bộ nhớ đệm: trình duyệt và máy chủ proxy, cố gắng tăng tốc công việc của trang web, cố gắng lưu càng nhiều tài liệu vào bộ nhớ đệm càng tốt. Nếu bạn mở một trang web trong một trình duyệt, sau đó mở một trang khác và sau đó quay lại trang đầu tiên, với khả năng cao là trình duyệt sẽ lấy nó từ đĩa của bạn (hoặc thậm chí từ RAM), nơi nó đã lưu trang trên chuyến thăm đầu tiên.

Rõ ràng là thao tác này thường nhanh hơn nhiều so với việc lấy cùng một tài liệu từ mạng. Rốt cuộc, để hiển thị trang, bạn không chỉ cần lấy mã HTML mà còn phải tải xuống tất cả các tài liệu đi kèm từ mạng: tệp CSS, hình ảnh, tập lệnh được thiết kế dưới dạng tệp riêng biệt, v.v. Nếu bạn nhìn vào các thư mục bộ nhớ đệm trên đĩa của mình (đối với IE, thư mục này thường nằm ở đây: “C: \ Documents and Settings \ tên tài khoản\ Local Settings \ Temporary Internet Files ", dành cho Firefox:" C: \ Documents and Settings \ tên tài khoản\ Cài đặt cục bộ \ Dữ liệu ứng dụng \ Mozilla \ Firefox \ Hồ sơ \ _random_string_. default \ Cache "), bạn sẽ thấy có bao nhiêu tệp đã được lưu bởi trình duyệt của bạn.

Tất nhiên, bộ nhớ đệm giúp tăng tốc công việc lên rất nhiều, nhưng mặt khác, bộ nhớ đệm có thể đóng một vai trò tiêu cực.

Ví dụ: nếu trang trò chuyện được lưu trong bộ nhớ cache, thì người dùng sẽ không thấy tin nhắn mới. Các quản trị viên web thường coi bộ nhớ cache là một thứ xấu xa và hãy chiến đấu với cái ác này bằng hết khả năng của họ.

Sự cố vào bộ đệm trong Microsoft Internet Explorer

Internet Explorer lưu vào bộ nhớ cache các yêu cầu GET. Các tác giả không quen thuộc với bộ đệm HTTP cho rằng các yêu cầu GET không được lưu trong bộ đệm hoặc bộ đệm có thể bị bỏ qua, như trong trường hợp nhấp vào nút làm mới. Trong một số tình huống, tránh bộ nhớ đệm thực sự là một sai lầm. Một giải pháp là sử dụng phương thức POST, phương thức này không bao giờ được lưu trong bộ nhớ cache; tuy nhiên, nó được dành cho các hoạt động khác. Một giải pháp khác là sử dụng phương thức yêu cầu GET bao gồm một chuỗi truy vấn duy nhất với mỗi lần gọi, như được minh họa trong ví dụ bên dưới.

Req.open ("GET", "xmlprovider.php? Hash =" + Math.random ());

hoặc đặt tiêu đề Expires thành một ngày trong quá khứ trong tập lệnh tạo nội dung XML của bạn. Trong PHP, nó sẽ như thế này:

// vô hiệu hóa tiêu đề bộ nhớ đệm của IE ("Hết hạn: Thứ Hai, ngày 26 tháng 7 năm 1997 05:00:00 GMT"); header ("Lần sửa cuối:". gmdate ("D, d M Y H: i: s"). "GMT"); header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache"); ...

Mã PHP quen thuộc? Tôi chắc rằng bạn đã viết nó (như một quy luật, sử dụng Sao chép dán) Trong công việc của họ. Nhưng! Có một điều rất quan trọng là "NHƯNG" ở đây: không có cách nào coi thường tầm quan trọng và thẩm quyền của Wikipedia, chúng tôi chỉ lưu ý một thực tế đáng tiếc rằng mã này là SAI! Bạn có muốn bị thuyết phục? Một cách dễ dàng!

Kiểm tra bộ nhớ đệm

Vì vậy, hãy bắt đầu Apache với các cài đặt mặc định, tiêu chuẩn. Sau đây, chúng tôi sử dụng Apache và PHP. Nhưng điều này không có nghĩa là sự cố được mô tả và các tùy chọn cho giải pháp của nó không có sẵn trên nền tảng của các máy chủ khác, chẳng hạn như Microsoft IIS. Vì vậy, hãy bắt đầu Apache. Tạo một thư mục bộ đệm thử nghiệm trống trong thư mục gốc của máy chủ và đặt tệp test-1.php vào đó với nội dung sau:

", ngày (" H: i: s "),""; ?>

Dễ dàng nhận thấy rằng trong ví dụ đã cho chúng ta cố gắng vô hiệu hóa bộ nhớ đệm theo công thức của Wikipedia và chỉ hiển thị thời gian hiện tại.

Bài viết liên quan: Lưu trữ không tốn kém với cấu hình riêng lẻ

Bây giờ hãy thử xem thư mục của bạn trong trình duyệt. Để thực hiện việc này, hãy mở trình duyệt của bạn và nhập vào thanh địa chỉ

Tốt! Bây giờ hãy nhấp vào tệp test-1.php của bạn và ghi nhớ thời gian (ví dụ: tôi đã đặt một cửa sổ trình duyệt bên cạnh đồng hồ Windows):

Tuyệt vời! Bây giờ hãy nhấp vào các nút "Quay lại" trong trình duyệt và sau đó nhấp vào "Chuyển tiếp":

Giáo sư! Thời gian không thay đổi !!! Nó có nghĩa là gì? Có, chỉ là trình duyệt lấy trang từ bộ nhớ cache !!! Nhưng những gì về của chúng tôi bách khoa toàn thư mã số? Nó không hoạt động!

Hãy chuyển sang các nguồn chính

Vấn đề là gì? Vấn đề là sử dụng tiêu đề phản hồi không chính xác. Trong đặc điểm kỹ thuật RFC2616 toàn bộ chương được dành cho bộ nhớ đệm. Thật không may, quản trị viên web không thường xuyên đọc thông số kỹ thuật. Vậy những tiêu đề mà chúng ta vừa duyệt qua có ý nghĩa gì? Hãy xem chúng. Rất thuận tiện để thực hiện việc này bằng tiện ích bổ sung Thanh công cụ dành cho nhà phát triển web của Firefox cho trình duyệt: Thông tin. Xem tiêu đề phản hồi(đối với IE, một công cụ tương tự được gọi là DevToolbar):

Vì vậy, chúng tôi đã chuyển các tiêu đề sau:

Hết hạn: Thứ Hai, ngày 26 tháng 7 năm 1997 05:00:00 GMT- tiêu đề này đặt thời gian khi thông tin được cập nhật. Chúng tôi đang cố gắng chuyển ngày trong quá khứ, giả sử rằng điều này sẽ buộc trình duyệt tải trang từ máy chủ mọi lúc. Nó không ép buộc, như chúng tôi đã nhận thấy từ kinh nghiệm.

Lần sửa cuối: Thứ bảy, ngày 26 tháng 1 năm 2008 17:03:02 GMT- Ngày giờ thay đổi thông tin trên trang. Tiêu đề này không ảnh hưởng đến bộ nhớ đệm theo bất kỳ cách nào (đọc trong RFC2616!), Ngoại trừ việc nó có thể được sử dụng cho một yêu cầu với trình xác thực. Ví dụ: một trình thu thập thông tin có thể yêu cầu dữ liệu như sau:

Đó là, " cung cấp tài liệu nếu nó đã thay đổi kể từ ngày được chỉ định", Và máy chủ sẽ phản hồi bằng 200 (" Đây là tài liệu, nó đã thay đổi! "Hoặc 304" Không có thay đổi nào. ". Nhưng chính chúng ta, bằng chính đôi tay của mình và thật ngu ngốc bách khoa toàn thư mã hoàn toàn phá hủy những hy vọng cuối cùng cho nó! Có nghĩa là, chúng tôi không những không cấm bộ nhớ cache mà còn cho các công cụ tìm kiếm (hay nói đúng hơn là CHÍNH BẠN) triệt để! Rốt cuộc, bạn đã vượt qua ngày HIỆN TẠI là ngày thay đổi cuối cùng, nhớ không?

Cache-Control: no-cache, phải xác thực lại- bây giờ, gần với chủ đề hơn. Chính tiêu đề này điều khiển bộ nhớ đệm, nhưng không phải tự nó mà kết hợp với những người khác. Bây giờ chúng ta vừa chuyển lệnh sau: "Nếu lệnh no-cache không chỉ định tên trường, thì cache KHÔNG ĐƯỢC sử dụng phản hồi để đáp ứng yêu cầu tiếp theo mà không được xác thực lại thành công với máy chủ gốc). Về cơ bản, trong biểu mẫu này, nó là một lệnh không dành cho trình duyệt mà dành cho máy chủ proxy.

Bài viết liên quan: Cách chọn máy chủ cho một trang WordPress: mẹo cho người mới bắt đầu

Pragma: no-cache- thiết kế lỗi thời. Đây là phiên bản cũ của giao thức HTTP / 1.0. Hầu như tất cả các trình duyệt và proxy đều bỏ qua nó. Vì vậy, chúng ta có thể thấy rằng không có dòng mã PHP nào thực sự vô hiệu hóa bộ nhớ cache. Để làm gì? Đây là những gì:

Không cho phép lưu vào bộ nhớ đệm

Lưu lại tệp test-1.php với tên mới là test-2.php và thay đổi nó như sau:

", ngày (" H: i: s "),""; ?>

Bây giờ hãy thử mở lại thư mục thử nghiệm của chúng tôi // localhost / test-cache /, nhấp vào tên test-2.php và bây giờ nhấp vào các nút Quay lại, Chuyển tiếp. Thời gian luôn thay đổi! Và điều này cho thấy rằng trình duyệt không lấy trang từ bộ nhớ cache khi tiến / lùi, mà yêu cầu lại từ máy chủ. Trên thực tế, chúng ta cần gì và cần gì. Hãy xem các tiêu đề phản hồi:

Đây rồi! Chúng tôi chuyển hai tiêu đề:

Cache-Control: no-store- trang chứa dữ liệu riêng tư, bạn không thể lưu vào bộ nhớ đệm! (Mục đích của chỉ thị không có cửa hàng là ngăn chặn việc vô tình phát hành hoặc lưu giữ thông tin nhạy cảm (ví dụ: trên các băng sao lưu))

Hết hạn: Thứ Bảy, ngày 26 tháng 1 năm 2008 20:31:55 +0300- mức độ liên quan của trang hết hạn ngay lập tức, tức là ngay bây giờ.

Và chính những tiêu đề này cấm bộ nhớ đệm trong trình duyệt. Nhưng vẫn đúng hơn nếu thêm hướng dẫn cho máy chủ proxy vào tiêu đề Cache-Control (file test-3.php):

", ngày (" H: i: s "),""; ?>

Thực tế không cho phép lưu vào bộ nhớ đệm

Như vậy, chúng ta đã tìm hiểu cách tắt bộ nhớ đệm. Điều này có nghĩa là bạn cần đưa đoạn mã trên vào tất cả các trang của mình? Không có gì! Nếu bạn cần tắt bộ nhớ đệm trong tất cả các tệp trong một thư mục (và không chỉ cho các tập lệnh php thực thi), bạn có thể định cấu hình máy chủ Apache để chuyển các tiêu đề mà chúng ta cần. Để thực hiện việc này, hãy mở tệp cấu hình máy chủ Apache và đảm bảo rằng các dòng sau được bỏ ghi chú (hoặc tự bỏ ghi chú chúng):

LoadModule expires_module modules / mod_expires.so LoadModule headers_module modules / mod_headers.so ... AddModule mod_expires.c AddModule mod_headers.c

Tốt! Bây giờ chỉ cần tạo một tệp .htaccess trong thư mục của bạn và viết những điều sau vào đó:

# # Tắt bộ nhớ đệm trong thư mục này # Phải bật mô-đun # mod_headers.c và mod_expires.c # # Cache-Control header Header append Cache-Control "no-store, no-cache, must-revalidate"# Tiêu đề hết hạn ExpiresActive On ExpiresDefault "now"

Mọi điều! Các tiêu đề cần thiết được chuyển tự động và không cần phải viết chúng cụ thể bằng PHP - bộ đệm ẩn đã bị tắt! Bạn có thể dễ dàng xác minh điều này nếu bạn nhìn vào các tiêu đề được truyền khi yêu cầu BẤT KỲ tệp nào trong thư mục này:

Độ phân giải bộ nhớ đệm

Tuy nhiên, mặc dù thực tế là số lượng lớn các quản trị viên web coi bộ nhớ cache là một tệ nạn phổ biến và đang cố gắngđể cấm nó (và, như chúng ta đã thấy, khá không thành công), nó không phải là! Bằng cách tắt bộ nhớ đệm, bạn buộc trình duyệt phải tải lại các trang của mình từ máy chủ mỗi lần và nếu kênh giao tiếp của người dùng yếu, điều này có thể dẫn đến việc làm việc với trang web của bạn bị chậm lại đáng kể. Tôi thậm chí không nói về thực tế là điều này dẫn đến việc tăng tải trên máy chủ của bạn! Nếu trang của bạn hoặc một phần của nó được hình thành bởi các truy vấn trong cơ sở dữ liệu, bạn sẽ tăng tải trên máy chủ cơ sở dữ liệu, điều này có thể có ảnh hưởng cực kỳ tiêu cực đến hiệu suất của toàn bộ máy chủ của bạn. Bạn hiểu những gì tôi đang nói, chẳng hạn, hãy xem tác phẩm của Odnoklassniki.ru! Một số quản trị viên web cũng khoe khoang, hiển thị những "thống kê" như vậy ở cuối trang: " Trang được tạo trong 0,9 giây, 9 truy vấn SQL được thực thi". Nó không hiển thị bất cứ điều gì khác ngoài kiến ​​trúc hoàn toàn ngốc nghếch của Ứng dụng web!

Bài viết sẽ hữu ích cho khách truy cập và chủ sở hữu trang web quan tâm rằng thông tin nhận được từ các nguồn của họ là kịp thời và chính xác. Sau khi đọc tài liệu này, bạn sẽ hiểu tại sao khách truy cập có thể thấy thông tin lỗi thời trên trang web, cũng như tìm hiểu cách giải quyết vấn đề này.


Hiện nay, tốc độ truyền dữ liệu trên Internet giúp bạn dễ dàng xem video chất lượng tốt, chơi game trực tuyến, sắp xếp hội nghị, tải và truyền tải thông tin nhanh chóng, v.v. Nhưng nó không phải luôn luôn như vậy! Mười năm trước, phải mất rất nhiều thời gian để chuyển 1 MB thông tin. Để tăng tốc độ tải các trang của trang web, người ta đã quyết định lưu một số dữ liệu trong bộ nhớ đệm (bộ nhớ) của trình duyệt trên máy tính cục bộ của người dùng. Trong lần truy cập tiếp theo vào trang web, trình duyệt đã tải chúng xuống từ đó, miễn là dữ liệu tải xuống không thay đổi.

Giờ đây, nội dung dữ liệu trong bộ nhớ cache của trình duyệt không còn quá nhiều cần thiết để tăng tốc độ tải xuống. Trong hầu hết các trường hợp, dữ liệu từ máy chủ được yêu cầu sử dụng phương thức GET hoặc HEAD. Theo mặc định, các yêu cầu với phương thức GET và HEAD được lưu vào bộ nhớ đệm (lưu) trong nhật ký máy chủ và máy chủ proxy, cũng như trong lịch sử trình duyệt. Do thông tin được lưu trong bộ nhớ cache, nhiều khách truy cập trang web sẽ thấy dữ liệu lỗi thời và dữ liệu mới sẽ chỉ có sẵn cho họ sau khi nó được xóa khỏi bộ nhớ cache. Điều này có thể gây ra vấn đề không chỉ cho khách truy cập trang web, mà còn ảnh hưởng đến lợi nhuận của công ty nếu trang web là thương mại.

Để giải quyết vấn đề này, bạn cần tắt dữ liệu bộ nhớ đệm được truyền từ máy chủ. Có nhiều cách để tắt bộ nhớ đệm trên Internet: tất cả chúng đều khác nhau và một số cách không còn hoạt động nữa.

Các quy tắc phổ biến nhất được xuất bản trên các nguồn có thẩm quyền www.spravkaweb.ru (http://www.spravkaweb.ru/php/sovet/nocash) và www.ru.wikipedia.org (http://ru.wikipedia.org/ wiki / thẻ meta). Nhiều trang web đã mượn các cài đặt này và đang sử dụng chúng ngay bây giờ.

Theo Wikipedia, nếu bạn viết trong tiêu đề của tài liệu

Một tài nguyên có thẩm quyền khác www.spravkaweb.ru tuyên bố rằng bốn tiêu đề có thể được truyền đi, điều này sẽ cấm bộ nhớ đệm dữ liệu trong bất kỳ điều kiện nào.

Với các cài đặt này, máy chủ sẽ gửi các tiêu đề được hiển thị trong Hình 3.

Hình 3 Tiêu đề phản hồi của máy chủ

Chúng ta hãy xem xét từng dòng để hiểu cách này sẽ hoạt động như thế nào.

Người ta đề xuất rằng tiêu đề về mức độ liên quan của tài liệu phải được thông qua vào ngày trước. Ví dụ: "Expires: Mon, 26 Jul 1997 05:00:00 GMT", do đó xác định rằng dữ liệu không còn cần thiết và không có gì để lưu vào bộ nhớ cache. Điều này sẽ khơi dậy sự nghi ngờ không chỉ giữa mọi người mà còn giữa các rô bốt tìm kiếm khi lập chỉ mục các tài liệu như vậy. Tại sao một robot phải giữ thông tin không liên quan trong chỉ mục? Công cụ tìm kiếm không thích nó khi họ cố gắng truyền dữ liệu không chính xác.

Tiêu đề Last-Modified cho trình duyệt biết ngày và giờ tài liệu được sửa đổi (trong ví dụ này, ngày và giờ sẽ là hiện tại). Nếu, với mỗi lần truy cập vào trang, rô bốt tìm kiếm được thông báo rằng tài liệu vừa thay đổi (mặc dù rô bốt không nhận thấy sự khác biệt trong chỉ mục tìm kiếm của nó), thì có lẽ, hệ thống sẽ coi đây là tác động đến mức độ liên quan kết quả tìm kiếm để cải thiện vị trí của trang web. Đây có thể là lý do cho việc áp đặt các biện pháp trừng phạt của các công cụ tìm kiếm.

Chuyển tiêu đề "Pragma: no-cache" để tắt bộ nhớ đệm dữ liệu là một trong những phương pháp đầu tiên, nhưng nó không hoạt động nữa.

Thí nghiệm

Ví dụ 1.

Hãy làm một thử nghiệm. Hãy tạo một tệp document cache.php, trong đó chúng tôi sẽ cung cấp các tiêu đề từ ví dụ để kiểm tra xem phương pháp tắt bộ nhớ đệm dữ liệu này có hoạt động hay không. Chúng tôi sẽ yêu cầu thời gian hiện tại từ máy chủ và xem thông tin đến từ đâu - từ bộ nhớ cache của trình duyệt hoặc tải xuống từ máy chủ.

Trong quá trình thử nghiệm, chúng tôi sẽ theo liên kết đến tệp .php cache nằm trên máy chủ thực và quan sát xem thời gian có được cập nhật hay không. Nếu thời gian không được cập nhật, thì dữ liệu được lấy từ bộ nhớ cache của trình duyệt và lệnh cấm không hoạt động.

Chỉ báo thời gian không được cập nhật và điều này một lần nữa chứng minh rằng hầu hết các tài nguyên đều chứa thông tin không chính xác về việc tắt bộ nhớ đệm. Điều đáng quan tâm là việc sao chép rất nhiều lỗi lầm của người khác, không chỉ trong một trường hợp cụ thể, mà nói chung trên toàn Internet.

Để chỉ ra một phương pháp vô hiệu hóa bộ nhớ đệm đang hoạt động, tôi sẽ đưa ra một ví dụ thứ hai, trong đó hiệu suất của nó cũng sẽ được kiểm tra thông qua một thử nghiệm.

Ví dụ 2.

Trong ví dụ đầu tiên, việc chuyển tiêu đề "Cache-Control: no-cache, must-revalidate" được đề xuất, nhưng nó đã được định cấu hình không chính xác. Hãy thêm tiêu đề với các tham số mới "Cache-Control: no-cache, no-store, must-revalidate, max-age = 0", trong đó

no-store - dữ liệu riêng tư không thể được lưu trữ trên đĩa cục bộ (tắt bộ nhớ đệm trong trình duyệt);

no-cache - chỉ thị được sử dụng để cấm lưu thông tin vào bộ nhớ đệm của các máy chủ proxy;

max-age = 0 - một chỉ thị chỉ định thời gian mà thông tin được lưu trữ trong bộ nhớ cache của trình duyệt;

phải xác thực lại là một chỉ thị thông báo cho trình duyệt về yêu cầu kiểm tra bổ sung về mức độ liên quan của tài liệu, trong trường hợp có nghi ngờ.

Hãy tạo một tài liệu cache2.php, trong đó chúng tôi sẽ cung cấp các tiêu đề mới để kiểm tra xem phương pháp tắt bộ nhớ đệm dữ liệu này có hoạt động hay không.

Thứ tự và điều kiện của thí nghiệm vẫn như cũ. Nếu thời gian thay đổi, điều đó có nghĩa là nó được yêu cầu từ máy chủ chứ không phải từ bộ nhớ cache của trình duyệt.

Vì thời gian được cập nhật mỗi khi trang được truy cập, nên phương pháp vô hiệu hóa bộ nhớ đệm thực sự hoạt động. Trong ví dụ này, các tham số được truyền từ chính trang, nhưng có thể có một phiên bản phổ biến hơn, được định cấu hình trên máy chủ. Trên máy chủ Apache, cài đặt được thực hiện thông qua tệp dịch vụ .htaccess, điều này cung cấp một cơ chế chức năng hơn để tắt bộ nhớ đệm cho tất cả các trang của trang web cùng một lúc. Trong tệp cấu hình, bạn phải bật các mô-đun mod_headers.c và mod_expires.c bằng cách xóa nhận xét khỏi đoạn mã

và thêm đoạn mã vào tệp .htaccess

Nếu máy chủ là Dịch vụ Thông tin Internet (IIS) 6.0, thì bộ nhớ đệm chỉ có thể bị vô hiệu hóa nếu bạn có quyền truy cập trực tiếp vào giao diện máy chủ. Điều này có thể được thực hiện trong tab "Tiêu đề HTTP" trong cài đặt máy chủ.

Trong bộ lễ phục. 6 cho thấy một ví dụ về cách tắt bộ nhớ đệm bằng cách chuyển các tiêu đề "Cache-Control: no-cache, no-store, must-revalidate, max-age = 0" cho các trang của trang web. Để định cấu hình tiêu đề Expires, bạn phải bật Bật nội dung hết hạn và Hết hạn ngay lập tức.

Nhược điểm của việc tắt bộ nhớ đệm

Việc tắt bộ nhớ đệm sẽ làm tăng tải trên máy chủ nơi đặt trang web, vì phải trả lời nhiều yêu cầu hơn. Đối với khách truy cập trang web, việc không cho phép lưu vào bộ nhớ đệm sẽ làm chậm tốc độ tải trang, nhưng điều này chỉ đáng chú ý khi tốc độ Internet chậm.

Phần kết luận

Nhận thông tin kịp thời đóng một vai trò quan trọng cho cả khách truy cập trang web và chủ sở hữu của họ. Do đó, chủ sở hữu tài nguyên web cần phải phân tích cẩn thận các tiêu đề được đưa ra bởi máy chủ của họ. Tắt bộ nhớ đệm là một cài đặt quan trọng cho phép khách truy cập chỉ nhận được thông tin thực từ trang web của bạn. Giờ đây, trên hầu hết các tài nguyên Internet, tiêu đề "Hết hạn" và "Sửa đổi lần cuối" được đưa ra, điều này không những không cấm bộ nhớ đệm mà còn có thể can thiệp vào việc lập chỉ mục bình thường của trang web bởi rô bốt tìm kiếm.

Các trình duyệt hiện đại thường sử dụng bộ nhớ cache cục bộ trong công việc của họ. Điều đó có nghĩa là gì? Điều này có nghĩa là trình duyệt, sau khi nhận được tài liệu html, hình ảnh hoặc tài nguyên khác từ máy chủ, sẽ đặt nó vào bộ đệm cục bộ của nó (nói cách khác, nó ghi tài nguyên đã nhận vào đĩa cứng của máy người dùng) và theo các yêu cầu tiếp theo. đối với một tài nguyên như vậy, nó không chuyển đến máy chủ mà nhận tài nguyên từ bộ đệm cục bộ.

Thuật toán trình duyệt này làm tăng đáng kể tốc độ tải các tài liệu html. Vì nếu tài nguyên đã được tải và kết quả là nằm trong bộ nhớ cache cục bộ, thì thời gian truy cập không được xác định bởi băng thông của kênh giao tiếp (ví dụ: kết nối modem), mà bởi tốc độ của phần cứng. đĩa.

Tuy nhiên, cùng với những ưu điểm của nó, phương pháp này cũng nảy sinh một số vấn đề. Đặc biệt, hầu hết các lập trình viên web mới bắt đầu, khi phát triển các trang web động, đều gặp phải vấn đề tương tự. Bản chất của vấn đề này là thay vì truy cập lại máy chủ cho một trang chạy tập lệnh trên máy chủ sửa đổi một số thông tin, trình duyệt truy cập vào bộ đệm cục bộ. Và kết quả là, ví dụ, trong ba lệnh gọi, không có ba sửa đổi thông tin nằm trên máy chủ, mà chỉ có một.

Để buộc trình duyệt yêu cầu một trang trên máy chủ mỗi lần, cần phải ngăn trình duyệt nhập tài nguyên này vào bộ nhớ cache. Sau đây là các phương pháp phổ biến nhất để tắt hoặc bỏ qua bộ nhớ đệm.

Tạo một URL mới

Giả sử rằng tài nguyên được yêu cầu có url sau: test.html? Id = 7. Như bạn có thể thấy từ url "và nó được truyền một tham số. Ví dụ: sử dụng JavaScript, hãy thêm một tham số nữa vào url và đặt giá trị của nó thành một số ngẫu nhiên. Kết quả là url sẽ giống như sau: test. html? id = 7 & rnd = 0.6700820127538827. Tham số ngẫu nhiên sẽ được tạo lại mỗi lần. Dưới đây là danh sách thể hiện cách tiếp cận này:

Tạo một URL mới liên kết thử nghiệm

Mỗi lần kết quả của một yêu cầu như vậy sẽ được lưu vào bộ nhớ đệm, nhưng vì bộ nhớ đệm được thực hiện trên toàn bộ url nên mỗi lần sẽ nhận được một url mới và trình duyệt sẽ buộc phải yêu cầu một tài nguyên từ máy chủ, vì url của cả hai yêu cầu sẽ không khớp chính xác.

Các trường tiêu đề

Bạn cũng có thể quản lý bộ nhớ đệm từ phía máy chủ. Để thực hiện việc này, tài nguyên được gửi đến trình duyệt kèm theo các trường tiêu đề. Bạn có thể tìm thấy mô tả chi tiết về các trường tiêu đề trong tiêu chuẩn RFC 2068, mô tả giao thức HTTP 1.1.

Trường tiêu đề hết hạn

Giá trị của tiêu đề này là ngày mà sau đó nội dung của tài nguyên sẽ hết hạn. Nếu người dùng sau ngày này truy cập tài nguyên, trình duyệt phải yêu cầu tài nguyên từ máy chủ, không phải từ bộ đệm cục bộ.

Nếu trường> Hết hạn< содержит дату, прошедшую, по отношению к текущей, то при следующем обращении к ресурсу браузер будет вынужден снова обратиться к серверу. Это произойдет вследствие того, что либо документ не будет занесен в кэш - как уже устаревший, либо при обращении к кэшу браузер определит, что документ уже устарел. Следующий листинг на PHP демонстрирует использование заголовка Expires:

Trường tiêu đề được sửa đổi lần cuối

Giá trị của tiêu đề này là ngày tài nguyên được cập nhật lần cuối. Hầu hết các trình duyệt hiện đại sử dụng thuật toán sau khi tài nguyên đã có trong bộ đệm ẩn cục bộ:

  • hỏi máy chủ về ngày cập nhật cuối cùng của tài nguyên
  • so sánh ngày đã nhận và ngày của tài nguyên trong bộ đệm ẩn cục bộ
  • nếu tài nguyên trên máy chủ mới hơn tài nguyên trong bộ đệm, thì tài nguyên đó được yêu cầu từ máy chủ

Nếu tài nguyên nằm trên máy chủ chứa ngày hiện tại trong trường này, thì mỗi lần trình duyệt sẽ yêu cầu tài nguyên đó từ máy chủ chứ không phải từ bộ đệm cục bộ. Danh sách sau minh họa việc sử dụng trường tiêu đề Được sửa đổi lần cuối:

Header ("Lần sửa cuối:". Gmdate ("D, d M Y H: i: s"). "GMT");

Các trường Cache-Control và Pragma Header

Cuối cùng, có các trường tiêu đề chịu trách nhiệm trực tiếp cho việc lưu trữ tài nguyên vào bộ nhớ đệm. Đồng ruộng Nó được định nghĩa trong tiêu chuẩn Rfc 1945 mô tả giao thức HTTP 1.0. Lĩnh vực này được coi là lỗi thời, nhưng trong một số trường hợp cần thiết phải sử dụng nó. Đặc biệt, một số máy chủ proxy xử lý không chính xác các yêu cầu liên tục thay đổi tài nguyên nếu trường tiêu đề này không được chuyển cùng với tài nguyên.

Trường thứ hai được định nghĩa trong tiêu chuẩn RFC 2068, mô tả giao thức HTTP 1.1. Trường tiêu đề này cho phép bạn tắt bộ nhớ đệm và mỗi lần yêu cầu tài nguyên từ máy chủ. Danh sách sau minh họa việc sử dụng các trường tiêu đề Cache-Control và Pragma để vô hiệu hóa bộ nhớ đệm:

Header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache");

Làm cách nào để tắt bộ nhớ đệm?

Câu trả lời của chủ nhân:

Tài liệu lưu vào bộ nhớ đệm không phải lúc nào cũng hữu ích về hiệu suất trình duyệt nhanh. Để vô hiệu hóa nó, bạn cần biết các tính năng vốn có trong mỗi trình duyệt Internet. Làm cách nào để tắt bộ nhớ đệm trong các trình duyệt internet phổ biến nhất?

Hãy làm như sau nếu Mozilla Firefox được sử dụng. Nhập opera: config vào thanh địa chỉ của trình duyệt. Một cửa sổ hiện ra cảnh báo bạn phải cực kỳ cẩn thận. Nhấp vào "Ok". Chúng tôi tìm thấy "Bộ lọc", ở đó chúng tôi nhập browser.cache. Sau đó, không quá mười dòng sẽ vẫn còn trong cài đặt.

Để tắt bộ nhớ đệm, hãy tìm browser.cache.disk.enable và browser.cache.memory.enable. Hãy tập trung vào trường giá trị. Cả hai dòng này đều đúng. Hãy thay đổi nó thành false. Sau đó, khởi động lại trình duyệt để mọi thay đổi có hiệu lực. 2. Thực hiện như sau nếu sử dụng Internet Explorer. Trong menu, mở "Dịch vụ", sau đó nhấp vào cửa sổ "Tùy chọn Internet". Cửa sổ thuộc tính của trình duyệt sẽ mở ra. Chuyển đến tab "Chung", nhấp vào "Tùy chọn" ở đó.

Sau đó, trong bộ chọn "Kiểm tra các trang đã lưu cập nhật", hãy chọn "Không bao giờ". Để tắt bộ nhớ đệm, hãy đặt số 0 bên cạnh cửa sổ "Dung lượng đĩa đã sử dụng". Sau đó, nhấp vào "OK" để chấp nhận các thay đổi.

Nếu sử dụng Opera. Nhấn các phím Ctrl + F12, sau đó chọn "Cài đặt chung". Hãy chuyển đến tab "Nâng cao", sau đó đến "Lịch sử". Tab In-Memory Cache, cũng như Disk Cache, sẽ được đặt thành Disabled để vô hiệu hóa bộ nhớ đệm. Trong cửa sổ "Kiểm tra tài liệu" và "Kiểm tra hình ảnh" chọn "Không bao giờ". Sau đó "OK", các thay đổi sẽ có hiệu lực.

Nếu sử dụng Google Chrome. Nhấp chuột phải vào phím tắt để khởi chạy trình duyệt. Sau khi menu ngữ cảnh xuất hiện, hãy chọn cửa sổ "Thuộc tính". Sau đó, trong cửa sổ xuất hiện, hãy chuyển đến tab "Phím tắt". Trong cửa sổ chỉ định địa chỉ tệp, hãy thêm “-disk-cache-size = 0-media-cache-size = 0”. Hãy đặt lệnh này sau dấu ngoặc kép của địa chỉ tệp. Hãy áp dụng các thay đổi.

Nó không phải lúc nào cũng hữu ích cho tất cả các trang web để lưu vào bộ nhớ cache tất cả hoặc các trang riêng lẻ. Điều này có vẻ lạ đối với một số người, vì bộ nhớ đệm giảm tải trên máy chủ, đặc biệt là khi có nhiều hoạt động và sự tham gia của khách truy cập, nhưng không phải đối với những người cập nhật nội dung quá thường xuyên trên các trang của trang web hoặc dịch vụ web và khách truy cập. sẽ luôn nhận được thông tin mới nhất và cập nhật trên mỗi lần tải trang. Các tài nguyên web này bao gồm các cuộc trò chuyện trên web, cuộc thăm dò ý kiến, trò chơi, tin tức, quầy và những thứ tương tự. Bài viết này sẽ giới thiệu các phương pháp để vô hiệu hóa bộ nhớ đệm của các trang của trang web.


Đây không phải là về cách vô hiệu hóa bộ đệm chỉ trong trình duyệt, mà là về cách vô hiệu hóa bộ nhớ đệm nội dung phía máy chủ. Nhiều người có thể biết các phương pháp vô hiệu hóa bộ nhớ đệm trong tiêu đề của các trang HTML, chẳng hạn như những phương pháp được đề cập trong Wikipedia, chẳng hạn như

Ngoài ra, bạn có thể sử dụng như

Dòng đầu tiên khuyến nghị không cho phép hoàn toàn vào bộ nhớ đệm và dòng thứ hai cho trình duyệt biết rằng trang đang được sử dụng ở chế độ riêng tư, vì vậy nội dung của nó không nên được lưu vào bộ nhớ đệm. Các thẻ meta ở dòng thứ ba và thứ tư chỉ ra rằng độ tuổi bộ nhớ cache được giới hạn ở max-age = 10800 (tương ứng là 3 giờ) cho trình duyệt và cho proxy.

Tuy nhiên, các khuyến nghị được đưa ra ở trên làm ví dụ là tốt, chỉ dành cho những chủ sở hữu trang web không có quyền truy cập vào các tập lệnh PHP và phù hợp hơn với các trang không động. Như họ nói, đây là "cơ hội cuối cùng", và chỉ vì nhiều trình duyệt, và bên cạnh đó, vô số phiên bản của chúng, ngày càng ít chú ý đến những gì được viết trong phần HEAD của các trang web. Mỗi người trong số họ “tự mình vén chăn lên”, không phải tất cả và không phải lúc nào cũng tuân thủ một số tiêu chuẩn. Nói cách khác, những gì đã nói ở trên có thể không hoạt động.

Tắt bộ nhớ đệm trang trong PHP

Một giải pháp thay thế cho điều này là vô hiệu hóa bộ nhớ đệm của các trang web sử dụng tập lệnh PHP, cụ thể là sử dụng tiêu đề (...); , cho phép bạn thêm các tham số và chỉ thị cần thiết vào tiêu đề gói HTTP. Hiện tại, các phiên bản mới nhất của các trình duyệt phổ biến và do đó, các máy chủ xử lý các tiêu đề gói HTTP này ít nhiều giống nhau. Về vấn đề này, một cách đáng tin cậy và linh hoạt hơn để tắt bộ nhớ đệm là sử dụng PHP.

Dưới đây là một ví dụ về một dấu hiệu đơn giản về thời gian lưu vào bộ nhớ đệm của các trang trên trang web:

Tuy nhiên, trên thực tế, điều này chỉ ra rằng điều này có thể là chưa đủ và sau nhiều lần thử nghiệm với các trình duyệt khác nhau, lựa chọn tốt nhất là vô hiệu hóa bộ nhớ đệm trong PHP sẽ có một cách tiếp cận như vậy:

Trong một số trường hợp, có thể hữu ích khi sử dụng các tham số bổ sung post-check = 0 và pre-check = 0 trong tham số tiêu đề

Header ("Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0"); ...

Một số tìm cách cấm lưu vào bộ nhớ đệm của các trang hoặc hình ảnh bằng cách thêm một số ngẫu nhiên (ngẫu nhiên) vào các liên kết làm tham số yêu cầu. Chính xác hơn, đây không phải là một lệnh cấm, mà là một nỗ lực để lừa trình duyệt tải lại trang, vì URL đã được thay đổi:

$ echo = "Liên kết"; $ echo = " ";

Đúng, điều này không phải lúc nào cũng hoạt động và không hoạt động trên tất cả các phiên bản và loại trình duyệt và nó chỉ có thể hữu ích trong trường hợp các liên kết được tạo động.

Kiểm tra xem bộ nhớ đệm có bị tắt không

Bạn có thể kiểm tra xem một trang có được lưu vào bộ nhớ đệm hay không bằng cách thêm thời gian máy chủ tại đó một trang cụ thể được tạo trực tiếp vào mã trang. Thật dễ dàng để thực hiện với PHP

Thời gian tạo trang: ". Ngày (" H: i: s ").""; ?>

Dòng 6 chứa mã ngày ("H: i: s"), hiển thị thời gian máy chủ chính xác mà trang được tạo. Do đó, với mỗi yêu cầu đến trang, với điều kiện bộ nhớ đệm bị tắt hoàn toàn, chúng tôi sẽ luôn thấy thời gian hoàn toàn mới. Tuy nhiên, nếu bộ nhớ đệm được thực hiện, thì với các yêu cầu thường xuyên, trang sẽ chứa cùng một thời điểm.

Tắt bộ nhớ đệm trang bằng Apache .htaccess

Gần đây, tôi đã gặp một trường hợp khi một cuộc trò chuyện trên web đột nhiên ngừng hoạt động trên một trong các cổng. Đúng hơn, nó hoạt động, hoàn toàn không có lỗi, nhưng người dùng chỉ thấy tin nhắn của họ trong đó, mà không thấy tin nhắn của người đối thoại với họ. Trong nỗ lực khắc phục tình hình, tôi phát hiện ra rằng máy chủ lưu trữ đã cập nhật cấu hình máy chủ Apache cùng với proxy bộ nhớ đệm Nginx. Sau đó, tôi đã cố gắng sử dụng gần như tất cả các phương pháp trên để vô hiệu hóa bộ nhớ cache, nhưng không giúp được gì. Hy vọng và nỗ lực cuối cùng đã được quyết định nhờ đến sự trợ giúp của Apache, để cố gắng sử dụng tệp .htaccess.

Bằng cách thêm các cài đặt sau vào tệp .htaccess có trong thư mục tập lệnh trò chuyện web, tôi đã giải quyết được sự cố:

Header append Cache-Control "no-store, no-cache, must-revalidate" ExpiresActive On ExpiresDefault "now"

Vì vậy, đối với những người có liên quan đến vấn đề cấm lưu vào bộ nhớ đệm của các trang web, tôi khuyên bạn nên sử dụng phương pháp sử dụng tệp .htaccess của máy chủ Apache. Đúng, điều này cũng sẽ chỉ hoạt động nếu các mô-đun tương ứng được tải và kết nối trên lưu trữ của bạn - mod_expires.so và mod_headers.so. Cho dù chúng được kết nối hay không, bạn có thể đảm bảo khi xem tệp cấu hình Apache, bảng điều khiển trên máy chủ lưu trữ hoặc trong trường hợp nghiêm trọng bằng cách liên hệ với bộ phận hỗ trợ kỹ thuật lưu trữ khi có câu hỏi.

LoadModule expires_module modules / mod_expires.so LoadModule headers_module modules / mod_headers.so AddModule mod_expires.c AddModule mod_headers.c

Nếu bạn đã kết nối các mô-đun này, thì bạn có thể thao tác với bộ nhớ đệm của các tệp riêng lẻ, chẳng hạn như bằng cách thêm các lệnh sau vào .htaccess:

ExpiresActive On ExpiresDefault "now" Header append Cache-Control phải xác thực lại ExpiresDefault "ngay bây giờ"

Ngoài ra, bạn có thể chỉ định thời gian giới hạn bộ nhớ đệm, ví dụ:

ExpiresDefault "quyền truy cập cộng với quyền truy cập 1 tháng" # hoặc # ExpiresDefault "cộng với 4 tuần" # hoặc # ExpiresDefault "quyền truy cập" cộng thêm 30 ngày "

Các biến thể chỉ thị này có cùng ý nghĩa và ý nghĩa, và sẽ giới hạn bộ nhớ đệm trong khoảng thời gian 1 tháng. Bạn cũng có thể chỉ định các loại tệp nội dung với ngày hết hạn để lưu vào bộ nhớ đệm hoặc cho biết thời gian sửa đổi chúng:

ExpiresByType text / html "quyền truy cập cộng với 1 tháng 7 ngày 12 giờ" sửa đổi ExpiresByType image / gif "cộng thêm 3 giờ 15 phút"

Đó có lẽ là tất cả cho bây giờ. Tôi hy vọng thông tin sẽ hữu ích cho bạn. Nếu bạn có những phát triển, bổ sung của riêng mình, thì đừng ngần ngại, hãy viết chúng trong phần bình luận hoặc gửi cho tôi qua đường bưu điện, và tôi sẽ bổ sung (sau khi kiểm tra) vào bài viết này.