小弟最近做了一个个人博客,有不同的栏目,由于服务器的性能限制(虚拟主机、IIS)以及权限的限制,虚拟主机没法一直跑着PHP,于是想把所有的博客文章全部生成静态HTML页面。每次在后台添加一篇文章数据,那么就会自动生成一个静态的HTML页面。
但是考虑到以后可能对整个博客的所有版面的布局、样式或者内容进行统一修改,所以还写了一个生成所有数据为静态HTML的函数。
在函数里面是这样处理的:
1.先读取静态HTML的模板(里面用[title]、[content]、[author]等类似的变量做数据替换)。
2.然后从数据库中一次性读取所有的博客文章数据。
3.然后使用foreach进行循环,用文章数据替换静态HTML模板中的[title]、[content]等变量并生成静态的HTML页面。
……接着就OK了……但是考虑到我是一次性将所有的博客文章数据读取出来,这样可能会存在问题。
当然现在我的博客文章才几十篇,可以一口气读取出来,然后foreach。
但是如果随着数据的增多,如果博客文章数据有了上千条甚至上万条、十万条,每条数据就是一篇博客,内容大概有几千字。
这样算下去就很恐怖了,如果到时候一次性读取所有数据出来,估计CPU、内存都严重不够用,所以现在考虑着改变方法,不能再像以前那样一次性把所有数据读取出来然后foreach。我想了两种可能的解决办法:
1.先只读取所有数据的文章id并存入数组中。
然后使用foreach循环,根据单个id读取单条数据,利用单条数据生成一个静态HTML页面。
2.使用MySQL的游标同样一条一条数据地来处理。现在想问问各位乡亲父老、大哥大嫂,对于这种大量数据生成HTML页面的情况,如何尽量在保持低CPU占用、低内存占用的情况尽量提高效率。
是否还有比我想到的方法更加专业的解决方案。
有的话请告之,
没有的话,请问:我采取上面哪一种方式比较好。(如果是游标的话,最好能讲解详细点,比如简单实例之类的,因为游标操作以前只在Oracle和SQL Server中使用过,而且还只是在数据库中测试了下,没在项目中实际应用)。在此先谢过各位了,临表涕零。不知所云……

解决方案 »

  1.   

    当然是 使用MySQL的游标同样一条一条数据地来处理。
    你都能把数据读到二维数组里了,自然不存在不会用的问题对于这种大量数据生成HTML页面的情况,如何尽量在保持低CPU占用、低内存占用的情况尽量提高效率。
    虽然理论上的探讨的确很重要,但在实际应用中并无此需求。因为这种大量的生成只是偶尔为之
      

  2.   

    在每个页面底部加入一段js控制是否生成当前页面,可以避免同时生成大量html
      

  3.   

    1.先只读取所有数据的文章id并存入数组中。
    然后使用foreach循环,根据单个id读取单条数据,利用单条数据生成一个静态HTML页面。
    我曾经做过一个采集的项目,也遇到和你一样的麻烦问题。
    我想告诉你的是,不能简单的foreach,数组很大的时候,程序在30s内执行不完的。
    我当时是foreach 20条数据之后结束循环,再次进入该程序页面,继续执行20条之后的数组,依次类推,这样就避免了数据很大,执行不完的情况。
      

  4.   

    默认的脚本执行时间是30秒超时。一般时间超长的话,先解决时间超时问题set_time_limit(0);除非全新的界面或者版本,否则已经生成的静态页不需重新生成:有机制避免重复生成、减少开销。大批量处理,采用分割办法:
        简单分批: 如总1000条,每次处理50条。
        综合分批: 按频道、按分类、每日期进行批次处理。这样,不管是脚本读取数据库的压力还是脚本先成文件的压力都可以控制。除了数组循环的方式,还可以用xml的方式实现异步处理。这样可以用综合分批的方式,多个批处理同时进行,加快处理速度。处理的过程中,要进行状态标记,如果遇到暂时的错误,应可以忽略,继续处理下一条。对于出错进行记录,以便审查时重新单独对出错的情况操作。