THINKPHP3.2版本在SAE上无法生成静态缓存的BUG修改办法

浏览:1601 发布日期:2014/05/19 分类:技术分享 关键字: 静态缓存
最近网站的PV大了,就像把静态缓存做起来,可是发现OT无法在SAE上生成静态缓存,于是去下了最新的TP,写了个主页页面扔到SAE上,一样无法生成。于是看了下TP源码,找到解决办法了



解决方案:在ThinkPHP/Library/ReadHtmlCacheBehavior.class.php里109行,把

if(!is_file($cacheFile)){ 改成

if(!is_file($cacheFile) && !function_exists('saeAutoLoader')){





分析:

读和写分别是WriteHtmlCacheBehavior.class.php ReadHtmlCacheBehavior.class.php

我是一步一步用die去测试的。。。。

发现写是么问题的,在KVDB里也能找到这个静态文件,那么就是在读里面了   // 行为扩展的执行入口必须是run
    public function run(&$params){
        // 开启静态缓存
        if(IS_GET && C('HTML_CACHE_ON'))  {
            $cacheTime = $this->requireHtmlCache();
            if( false !== $cacheTime && $this->checkHTMLCache(HTML_FILE_NAME,$cacheTime)) { //静态页面有效
                // 读取静态页面输出
                echo Storage::read(HTML_FILE_NAME,'html');
                exit();
            }
        }
    }
发现在读取静态页面输出的IF里语句没有走,那么就是cacheTime或者$this->checkHTMLCache(HTML_FILE_NAME,$cacheTime)返回0了

cacheTime排除就剩下$this->checkHTMLCache(HTML_FILE_NAME,$cacheTime) /**
     * 检查静态HTML文件是否有效
     * 如果无效需要重新更新
     * @access public
     * @param string $cacheFile  静态文件名
     * @param integer $cacheTime  缓存有效期
     * @return boolean
     */
    static public function checkHTMLCache($cacheFile='',$cacheTime='') {
        if(!is_file($cacheFile)){
            return false;
        }elseif (filemtime(\Think\Think::instance('Think\View')->parseTemplate()) > Storage::get($cacheFile,'mtime','html')) {
            // 模板文件如果更新静态文件需要更新
            return false;
        }elseif(!is_numeric($cacheTime) && function_exists($cacheTime)){
            return $cacheTime($cacheFile);
        }elseif ($cacheTime != 0 && NOW_TIME > Storage::get($cacheFile,'mtime','html')+$cacheTime) {
            // 文件是否在有效期
            return false;
        }
        //静态文件有效
        return true;
    }
额。找到了,第一句他就判断这个文件是否是一个文件,不是就直接返回false了,这个在file缓存类型当然成立,在kvdb或者memcache就肯定错误了,把代码换成下面的就可以了if(!is_file($cacheFile) && !function_exists('saeAutoLoader')){
最佳答案
评论( 相关
后面还有条评论,点击查看>>