2009-03-16 47 views
7

Tôi đang gửi yêu cầu GET AJAX tới ứng dụng PHP và muốn lưu lại yêu cầu để sử dụng sau này.Yêu cầu AJAX trên bộ nhớ cache

Vì tôi đang sử dụng GET, điều này có thể xảy ra vì các yêu cầu khác nhau yêu cầu các URL khác nhau (ví dụ: getHTML.php? Page = 2 và getHTML.php? Page = 5).

Tôi cần khai báo tiêu đề nào trong ứng dụng PHP để làm cho trình duyệt của khách hàng cache nội dung URL yêu cầu theo cách phù hợp? Tôi có cần phải khai báo bất cứ điều gì trong Javascript mà xử lý các yêu cầu AJAX (Tôi đang sử dụng chức năng $ .ajax jQuery có một tham số bộ nhớ cache)?

Tôi làm cách nào để xử lý các chỉnh sửa thay đổi nội dung của ví dụ: getHTML.php? page = 2 để khách hàng không quay trở lại phiên bản được lưu trong bộ nhớ cache? Thêm thông số khác vào yêu cầu GET, ví dụ: getHTML.php? page = 2 & version = 2 là không thể vì liên kết tới URL được yêu cầu được tạo tự động mà không cần kiểm tra (tốt nhất là cách tôi muốn).

Trình duyệt sẽ phản ứng như thế nào khi tôi cố gắng AJAX yêu cầu URL yêu cầu được lưu trong bộ nhớ cache? Liệu AJAX-yêu cầu trả lại thành công ngay lập tức?

Cảm ơn

Willem

Trả lời

3

Khi bạn làm mới trang, bạn vẫn sẽ thực hiện cuộc gọi máy chủ cho nội dung, ngay cả khi bạn đã yêu cầu họ trước đây. PHP tiêu đề sẽ không giúp bạn ra ngoài với điều đó.

Tôi nghĩ rằng những gì bạn cần là cơ chế lưu vào bộ nhớ cache phía máy khách của nội dung đã được yêu cầu từ máy chủ trong trang hiện tại.

Đối với trường hợp sử dụng này, bạn có thể sử dụng bảng băm trong JavaScript và truy vấn trước khi thực hiện cuộc gọi đến máy chủ. Điều này sẽ nâng cao trải nghiệm người dùng vì người dùng sẽ không phải chờ một yêu cầu nội dung khác mà anh đã xem.

Dưới đây là một ví dụ:

//placeholder for hash table as cache 
var cache = []; 

var getPage = function(pageNr){ 
    if(cache[pageNr]){ 
     //content is already in cache, use it from there 
     handleContent(cache[pageNr]); 
    } 
    else{ 
     //object with parameteres sent with GET request 
     var params = {}; 
     params.page = pageNr; 

     $.ajax({ 
      url: "getHTML.php", 
      data: params, 
      cache: false, 
      success: function(response){ 
      //handle your response here 
      handleContent(response); 

      //store the response in the cache for later use 
      cache[pageNr] = response; 
      } 
     }); 
    } 
}; 

trang Bây giờ yêu cầu đầu tiên sẽ tìm trong bộ nhớ cache hiện tại để xem nếu bạn có nội dung. Nếu không, nó sẽ làm cho máy chủ gọi và lưu trữ phản hồi trong bộ nhớ cache.

Nó tương tự như những người dùng kinh nghiệm khi di chuyển qua tin tức trong Google Finance

Chú ý rằng nếu bạn làm mới trang bộ nhớ cache này sẽ bị xóa.

Trong trường hợp chỉnh sửa trang, bạn sẽ phải sử dụng các liên kết của Maurice Perry cho Yahoo Performance để đảm bảo rằng máy chủ của bạn luôn trả về phiên bản nội dung mới nhất.

thêm về bảng băm trong JavaScript: http://www.mojavelinux.com/articles/javascript_hashes.html

+0

Điều này sẽ tạo ra một bộ nhớ cache khá lớn [] cuối cùng. Đây là lý do tôi đã hy vọng có thể sử dụng các Header PHP để sử dụng bộ nhớ cache của trình duyệt (có thể sẽ không ảnh hưởng đến hiệu năng nhiều như một mảng JS lớn. – Willem

+0

Trừ khi bạn định sử dụng nó như một đĩa đơn ứng dụng đối tượng bộ nhớ cache không nên có kích thước lớn một cách bất hợp lý, khi đó, hãy nhớ rằng nó vẫn được lưu trữ trên máy khách, trong trình duyệt của người dùng Trong mọi trường hợp, bạn có thể chọn xóa nó khi nó đạt đến một điểm nhất định –

+0

I Tôi thực sự đang làm một trang "ứng dụng". Bạn có chắc chắn là không thể lưu trữ các đối tượng này lớn trên máy khách? – Willem

9

Thêm các tiêu đề sau trên máy chủ:

header("Cache-Control: private, max-age=$seconds"); 
    header("Expires: ".gmdate('r', time()+$seconds)); 

đâu $ giây có một ý nghĩa rõ ràng.

Ngoài ra, hãy kiểm tra xem máy chủ của bạn có phát hành một số tiêu đề chống bộ đệm khác như Pragma hay không.Nếu vậy, hãy thêm tiêu đề "Pragma: cache".

+0

+1 để sử dụng đúng tiêu đề http. – goat

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