今天发现 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 写得很棒,以前对这个机制一直不是很了解,这几天决定研究研究。
一直以来,公司的软件产品主要基于 MySQL 和 Oracle 两种数据库,有钱的客户就用 Oracle,没钱的用 MySQL。但最近由于公司与 IBM 进行合作,有些产品销售方案中包含了 DB2,所以从今天开始钻研 DB2 了,主要是 PHP 与 DB2 的结合,如果有人有这方面的资料(除了 IBM developWork 之外的),请告诉我,好让我尽快进入状态,呵呵。
整天工作工作,coding coding,人都快憋坏了,只好每天晚上打 CS 发泄发泄,看到网上好多人都出去旅游了,自己也开始动心了,但是没法请假,好惨呀~~
今天在 TSL 2.1 下加了个定时任务,脚本放在 /etc/cron.hourly 目录下,结果发现过来几个小时了都没有执行。于是就找了一下配置文件,发现没有 /etc/crontab 文件,而在 Redhat 中,/etc/cron.(hourly|daily|weekly|monthly) 的定时任务都是在 /etc/crontab 中设置的。
原来 TSL 使用的是 fcron,默认情况下不存在系统的 crontab,只对用户有 crontab 的概念。在 TSL 2.0 的时候,root 的 crontab 中有如下内容:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/bin:/usr/sbin
MAILTO=root
HOME=/
# Run-parts
01 * * * * run-parts /etc/cron.hourly
02 2 * * * run-parts /etc/cron.daily
22 0 * * 0 run-parts /etc/cron.weekly
42 0 1 * * run-parts /etc/cron.monthly
而到了 2.1 则去掉了,如果想在 2.1 执行 /etc/cron.(hourly|daily|weekly|monthly) 的话,可以以 root 身份,使用 crontab -e,将上述代码加入到 root 的 crontab 中。加完之后,在 /var/spool/fcron 目录下会有 root 和 root.orig 文件,root.orig 是文本的内容。
Update:如果想要系统 crontab 的话(实际上还是 root 的 crontab,为了避免混淆,TSL 才将其去掉),可以创建 /etc/fcrontab 文件,然后在此文件中加入上述 root 中的内容,最后通过运行
fcrontab /etc/fcrontab
使其生效,以后只要修改了 /etc/fcrontab 文件,都要运行此命令才能生效。
(more…)