2015-09-07 17:29:01  浏览:1347

cakephp

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

 

 

返回首页