解决方案:在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')){ 最佳答案