2011-11-19 158 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