关于 Cache(2)
今天发现 PHP Everywhere 还在讨论前两天的 WEB Cache 问题:Caching Personalised Pages,文中就 Shaz 的评论进行分析,提到了几种关于如何实现个性化页面的 Cache 的方法:
1) 使用 SESSION 存放用户个性化数据,比如用户名、头像图片地址之类的数据,但是这种方式不能存放过多的数据。
2) 将用户个性化数据集中在页面的某个区域,然后将页面的其他部分生成静态的 HTML 文件。当然,这是比较理想的状况,一般可能不会太容易实现。
3) 为了更新过时的数据,可以使用计数器,用于保存页面的更新次数,此计数器值保存在数据库中,然后创建触发器,此触发器可以保存在像 PostgreSQL 或 Oracle 这样的数据库中,也可以在 PHP 代码中实现。每次用户登录访问页面时,取出页面的更新计数值,与用户 SESSION 中保存的这个值进行相比较,如果这两个值不相同,表示页面已经更新,此时触发器将重新加载用户的个性化数据。这种方法必须是 [u]获取更新计数的代价[/u] 小于 [u]更新用户个性化数据的代价[/u] 才行。
4) 另外一种方式是利用客户端浏览器 Cache 数据。创建一个由 PHP 生成的 JavaScript 代码文件,用户登录之后会通过此 JavaScript 获取其个性化数据。当然,此 JavaScript 必须输送恰当的 caching 头文件信息,否则浏览器不会进行正确更新缓存文件的动作。保存个性化数据的 JavaScript 代码类似于:
theUser='<?php echo $_SESSION['USER_NAME'J; ?>'; theFavoriteIcon = '<?php echo $_SESSION['FACE_ICON'J; ?>';
在生成的静态 HTML 文件中,使用如下代码输出个性化数据:
<script> document.write(theUser) </script>
此技巧可以在服务器端 Cache 整个 HTML 页面,另外还可以在客户端 Cache 用户个性化数据。
在我的实践中,使用过第 1、2、4 在种方法,还有一种方法就是将动态的数据放入 iframe 中,只不过这种方式通常会导致页面不太美观。我非常赞同最后一种方式,因为这种方式可以将动态数据与静态 HTML 文件分开,很好地实现 Cache 页面的目的。另外,HTTP conditional requests in PHP 写得很棒,以前对这个机制一直不是很了解,这几天决定研究研究。