2011-11-19 159 views
0

基本上,我試圖弄清楚的是,在諸如Facebook這樣的網站上,諸如「您可能認識的人」等邊欄在加載時動態生成。如果您導航到另一個頁面,然後使用瀏覽器,請單擊歷史中的「返回」,帶有動態內容的側面板與第一次查看它們時的側面板相同。如何從歷史記錄加載不運行PHP?

在我的網站上,當您回到瀏覽器歷史記錄中時,我的動態內容與第一次說明時不同,但PHP運行並在頁面上放置了新的動態內容。

如果用戶點擊「歷史記錄」中的「後退」或「前進」,如何跳過運行PHP/SQL查詢?

這裏是AJAX調用我提出:

<script type="text/javascript"> 
$(document).ready(function() { 
    $.ajax({ 
     type: 'post', 
     url: '/ajax/ajax_common.php', 
     async: true, 
     cache: true, 
     data: { [data here] }, 
     success: function(data) { 
      $('#photos').html(data); 
     } 
    }); 
}); 

它得到的數據,但是當我去到另一個頁面,點擊返回它的變化,並沒有保存到緩存中。 AJAX查詢調用一個生成一些隨機照片的函數。

+0

請記住,Facebook使用AJAX的99%的內容。也就是說,您看到的「緩存」只是預取的信息,可以重新加載。機會是你的後退按鈕正在發出全新的請求,而不是回到AJAX請求隊列中。 –

+0

您需要爲腳本設置正確的Expires頭,以便瀏覽器緩存結果。 –

+0

這是否會鼓勵使用memcache? Facebook是一個例子,還有很多其他的網站都這樣做。 – Fase

回答

1

您可以將session_cache_limiter()設置爲private。或者,您也可以實現同樣的功能,但通過手動設置使用header()的標題可進行更多控制。

正如你想要緩存某些div的數據,最好的方法是使用javascript。您可以使用JQuery使用AJAX將數據提取到這些div中。

例如,數據可能包含在memberlist.htmlmemberranking.html中。

然後使用jQuery.ajax(),您可以獲取memberlist.htmlmemberranking.html,然後將其插入到您的頁面中。同時,當您運行AJAX請求時,將cache設置爲true,結果將被瀏覽器緩存。

顯然,這對於未啓用javascript的用戶無效,因此您可能需要查看SSI(服務器端包含)。

或者,您可以使用緩存(例如APC或memcached)進行對象級緩存。這將需要坐在你的PHP層,你將需要能夠處理請求,看看是否可以使用緩存副本。如果發生基礎數據的更新或刪除,您還需要編寫自己的一套過程以從緩存中刪除對象。

+0

對此進行了擴展,如果新頁面加載時如何使用它來獲取新內容,並且如果從歷史記錄加載則使用舊內容。 – Fase

+0

我不得不取消這個作爲答案,因爲我注意到它的一些問題。 1)如果您在頁面上登錄,它會顯示您沒有登錄,直到您加載另一個頁面。 2)如果你關閉並打開瀏覽器,它會顯示你登錄時,你不是。我需要它將緩存隔離到某些DIV。 – Fase

+0

我編輯了我的答案。 – F21