我的开发机上,出现了一个奇怪的现象:之前有个项目A,使用了cake框架,目录是/wwwroot/A。因为要进行改版,且将web server从lighttpd改成apache,我一时懒惰,就直接将A cp 到/wwwroot/A_v2,域名也没变,缓存、db等配置都没变。之后,要用到旧版,我就启动lighttpd,用新版就启动apache~

后来,由于种种原因,A和A_v2上都有了一些不同的改动。当我stop了apache,切换到lighttpd的时候,cake总给我报,找不到control下的一个action,而这个action明明是存在于A目录文件中的,只是不存在于B中而已。

这时,怀疑是缓存的问题,看了下app/config/下的文件和cake/config/path.php等,与cache相关的define是app/tmp/cache,但是我的A和A_v2的cache目录都是空的。

跟踪发现,/wwwroot/A/index.php和/wwwroot/A/app/webroot/index.php都访问正常,而加载dispatch的时候,就不正常了~开始怀疑是不是用了autoload之类的,结果搜索__autoload 和spl_autoload_register都没有。搜索发现,cake没有自带autoload之类的,而是在cake/bootstrap.php中显示的App::import(‘Core’, array(‘Dispatcher’));

所以问题就出在这个APP::import中了。该函数中有这么一行 $_this =& App::getInstance(); ,在getInstance中,果然出现了cache的字样:

function &getInstance() {
static $instance = array();
if (!$instance) {
$instance[0] =& new App();
$instance[0]->__map = Cache::read(‘file_map’, ‘_cake_core_’);
}
return $instance[0];
}

再跟下去,发现cache使用域名跟上固定字符串,形成key,而我的A和A_v2使用了同样的域名,所以file_map就互相覆盖了~~

看来偷懒不得啊~由于我的缓存用的是memcache,app/config/core.php中配置的default是本地、11211端口,重启就ok了。

Leave a Reply