求一个客户订阅rss,定时更新的方法
正在制作一个网站,可以提供客户通过关键字搜索订阅本地的rss,但是为了保护数据库的调用量,准备限制客户的调用次数。
大致思路是:用户第一次订阅是,调用数据库,生成静态xml文件。根据xml生成时间为基准,每24小时自动更新一次。
思路一:用户每次请求xml时,根据 time()-filectime 判断,如果大于 24*60*60 时,再次运行php文件,调用数据库,更新xml文件。问题是,既然已经生成了静态的xml文件,如何让xml通知php文件,告诉它:“我已经过期了,请再次更新我吧”?
思路二:把用户订阅写进shell里,让cron定时后台运行。问题是:当用户订阅数成倍增长后,shell脚本体积不断增大,会变的繁重。另外,如果shell脚本在同一时间有读出和写入,shell脚本会不会崩溃?或者导致cron程序被跳过?
思路三:还没想好,或许大家有更好的方法对我建议。谢谢。
btw: 个人倾向:根据 time()-filectime 判断,这样可以排除恶意用户在第一次订阅后人间蒸发(rss订阅被摒弃),而我的cron程序还在为他每24小时自动的空生成一次……
------解决方案--------------------
php 可以读取xml的生成时间进行判断。不过如果有大量xml文件的时候得考虑io瓶颈的问题。 所以如果不行的话就将生成的时间入库。用数据库来配合工作,可能会好点
xml很多吗?不多的话可以用memcache 来配合一下
------解决方案--------------------
1楼就这个意思
就是个文件缓存
abcd可以md5一下,可以防止一些特殊字符造成的麻烦,
暴力破解不是问题,因为你可以把xml放在web root外的目录, 也可以用.htaccess来控制直接访问
xml文件太多了也会有问题,根据需要到时候可以定期删除长期不更新的文件,或者分目录层次.
另: 如果是纯xml文件, file_get_contents比include快
探讨
嘿,考虑了一下,可不可以这样?所有的rss订阅定义到一个php文件 rss.php?search=abcd
php code
$file_name = $_get['search'].'.xml'; //abcd.xml
if(time()-filectime($file_name)>24*60*60){
//查询数据库,生成新的xml文件,然后被读取
}else{
……
------解决方案--------------------
xml的修改时间可以使用head方法取得last modify时间,搜索引擎蜘蛛都是这样做的。