cakephp在不开启缓存的情况下,需要加载很多文件,是很慢的,这个框架虽然强大,但是为人诟病的一直是他的速度,最近由于需要,需要开启缓存,按照手册上的说明,顺利的实现了,打开页面速度大大提升了。
但是出现了一个新的问题,
首页缓存文件名本应该为home.php却被保存为om.php,
pages_1_html.php 被保存为 p_tml.php
pages_2_html.php 也被保存为 p_tml.php
像这种分页的缓存,页码都被忽略掉了,所以返回的都是第一页的数据。
问题出在哪里呢?既然是没有生成缓存未见,我们就一步步的调试吧,
首先我们打开cake/libs/views/helpers/cache.php
找到 __writeFile方法,看到有这么一行
return cache('views' . DS . $cache, $file, $timestamp);
?>
这个时候我们找找$cache这个变量看看在什么地方生成的,我们在这个方法中找到可这么一行
$cache = strtolower(Inflector::slug($new_path));
?>
问题就处在这里,这里做了一个试验,只要是缓存,均被阉割了。
所以造成无法正常生成对应的缓存文件,原因何在呢?我们找到libs/inflector.php,打开这个类。
找到slug方法,看看写了什么,代码是这样的:
public static function slug($string, $replacement = '_') {
$quotedReplacement = preg_quote($replacement, '/');$merge = array(
'/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
'/\\s+/' => $replacement,
sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
);$map = self::$_transliteration + $merge;
return preg_replace(array_keys($map), array_values($map), $string);
}
实验:修改lib\Cake\View\Helper\CacheHelper.php中的_writeFile方法
echo $path."\n";
$cache = strtolower(Inflector::slug($path));
echo $cache."\n";
die();
首页返回
home | om |
/pages/16.html | p_tml |
/pages/17.html | p_tml |
这样分页就没有什么用处了。
经过分析,很可能是因为slug没有匹配到某些字符,所以加上数字\d和字母\w的正则
public static function slug($string, $replacement = '_') {
$quotedReplacement = preg_quote($replacement, '/');$merge = array(
//'/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',//有问题,无法显示完整
'/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}\d\w]/mu' => ' ',
'/\\s+/' => $replacement,
sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
);$map = self::$_transliteration + $merge;
return preg_replace(array_keys($map), array_values($map), $string);
}
修改之后
home | home.php |
/pages/16.html | pages_16_html.php |
/pages/17.html | pages_17_html.php |
也能正确匹配中文字符,例如:/tag/中文字符.html tag_e4_b8_ad_e6_96_87_e5_ad_97_e7_ac_a6_html.php