我是用thinkphp3.2开发的后台管理系统,现在需要生成静态页
生态静态页有两种方法,
第一种:是在后台调用实例化前台控制器,然后获取返回的模板内容再保存到文件中。这种方法相对第二种快一些。    public function listHtml($catid,$p,$classpath){
        $_GET=array(
            "catid"=>$catid,
            "p"=>$p,
            "isSystemMakeHtml"=>1,
        );
        $obj=new \Home\Controller\ListController();         
        $content=$obj->index();
        $filename=$p>1?("index_".$p.".html"):"index.html";
        $htmlfile=".".$classpath.$filename;
        \Think\Storage::put($htmlfile,$content,'html'); 
    }第二种:利用http请求,然后用file_get_contents抓取内容代码,再保存到文件。    public function listHtml($catid,$p,$classpath){
        $url = 'http://'.$_SERVER['HTTP_HOST'].U('Home/List/index',array("catid"=>$catid,"p"=>$p,"isSystemMakeHtml"=>1)); 
        $content = @file_get_contents($url);        
        $filename=$p>1?("index_".$p.".html"):"index.html";
        $htmlfile=".".$classpath.$filename;
        \Think\Storage::put($htmlfile,$content,'html'); 
    }两种方法利弊:
方法1优点:主要是不需要求过http请求,直接实例化。速度快一些;
方法1缺点:因为我是实例化Home模块下的控制器,模板里可能会用到home模块下的函数,但是生成静态页是在后台完成的。这样当模板调用home模板下的函数的时候,在后台生成就会报错,这个也是致使的缺点。还有就是当前台模板出错的时候方法生成页面就中止了。方法2优点:这个优点就是方法1的缺点,只要前台有内容输出就可以保存页面,哪怕程序出错也会生成。活会一直干下去;
方法2缺点:速度慢,速度慢,总之就是慢。200个静态页要生成3分钟左右,上万个的话时间更是长。求大家支支招。

解决方案 »

  1.   

    你的解决方案都不是很好的方案,你已经把思路定位错了。你为什么要采用这种方式实现静态缓存呢?
    应该是你的前端模块进行逻辑判断:后台是否设置了缓存->如果设置了启用缓存->判断缓存文件是否存在->缓存文件不存在则自动生成缓存文件。
    你的后端逻辑应该是:
    缓存配置:配置某个页面是否启用缓存
    新增/更新数据时:更新缓存文件这样前端始终拿到的都是最新的缓存数据
      

  2.   

    您说的方法我也考虑过。但是我参考了一些cms原理,都是需要在后台集中刷新然后生成html页面的。不能通过前端某一个页面来触发。
    因为有的页面本身也可能调用其它页面的最新信息,比如详情详情最下面可能有一个最新新闻。那么最新添加新闻好,肯定要更新其它页面,便于显示最新的内容。