最近在制作一个RSS咨询聚合类的网站。
所有的RSS分析进数据库,并将每一条记录生成静态页面。
每条记录插入时,还需判断记录是否重复(某些RSS源更新速度慢,须避免重复记录)
所有的RSS抓取全部用CRON完成。求教。一个生成静态页面的思路。
如何根据每篇文章的ID生成静态页面?我的思路有点窄。
第一:插入数据库同时,生成。(可能需要多次数据库检索,就像前面说的,还要检查记录是否重复,不是每条分析进来的RSS都生成。)
第二:定时设置CRON程序,将生成静态页面后的页面路径UPDATE进每条记录后,每次检索空记录,生成。但是如果数据库日益庞大,这种查询对数据库压力也不小)大家是不是有好的方法,可以节省资源,又可以不遗漏的每条的生成静态页面?谢谢、  

解决方案 »

  1.   

    每条记录插入时, 需要判断记录是否重复..
    那么我认为决策点就在这里, 在这里能够决定是否要生成这个html.那么, 在这个点上来生成就是一个比较好的时机, 但是, 生成不一定要在此时完成, 把生成html作为一个独立的任务, 交由其他进程来处理.下面是我理解的一个思路, 高手请拍砖.
    思路: 通过任务队列实现静态页面的生成, 对于rss分析进数据库的过程不产生负担.
    流程:
    (以下流程假设任务队列使用system v的消息队列实现--php的semaphore扩展)
    1. RSS分析系统:
      1. 分析RSS
      2. 判断是否重复(决策是否生成html)
      3. 对需要生成html的, msg_send()将生成html需要的相关信息放入队列
    2. 开发另外一个静态页面生成程序(可以使用php来做常驻进程, 并发控制可以使用pcntl)
      1. msg_receive()
      2. 收到一个任务之后, 生成html
      3. 1,2两步往复循环.如果把上面的system v消息队列换成memcacheq或其他独立缓存中间件, 那么就可以把生成静态页面的任务分离到其他物理机器上, 便于扩展.
      

  2.   

    非常感谢你的回答。你的回答,我是不是可以理解为:
    A页面,在将RSS保存进数据库的同时,缓存一份数据,交由B页面完成静态页面的生成。
    A,B页面执行时间可以间隔为30秒。
    (这里的数据缓存可能比较大,某些RSS是全文订阅。msg_send()是否可以支持?或者别的哪种缓存格式比较好?)或者在同样,决策点在RSS保存进数据库这一点上。
    是否可以由A页面保存进数据库。B页面在30秒后执行,分析数据库里ID(AUTO INCREASE)记录的最后20条。
    如果没有生成过静态页面,则执行生成。这样的话,我的思路是再创建一个字段名,生成过记录的UPDATE为1,否则为0。(或者再将ID和判断生成记录的字段COPY到一个副表里)以上2点是我读了你的解答后的想法。我理解的是否正确?方法是否可取,经济?再次感谢。
      

  3.   

    请问lz,是否对每条记录都有必要生成静态页面?是否每个页面都会被访问?从什么依据推测“数据库压力大”?是写入压力过大吗?如果该数据库仅用来做rss内容的保存,生成完静态页面后,对数据库的读访问应该是很小的。而如果使用行级锁,写入对读的影响也不大。并且你用的是cron执行写入,那么写的连接数是可控的。如果数据库读压力不大、仅对需要的页面静态化的话,可以使用php的ob_族函数来做静态化。
    即用户访问一个页面,比如ID为23。如果该页面已静态化,则直接访问。否则从数据库读取,在输出内容前使用ob_start,内容完全准备好后,用ob_get_contents获取并写入到静态文件中,并输出给用户。这里存在的问题是,如果同时有多个用户访问同一个未静态化的页面,可能会重复静态化。
    但是这种方法代码结构比较清晰,易维护。
      

  4.   


    大致理解是对的, 但是, 这里的B页面不是web方式运行, 是以php cli方式运行...
      

  5.   

    看看这篇文章能不能帮到你,PHP生成静态HTML文件