
phpcms已经内置了这个缓存,但一直不知道如何启用。
折腾了一晚,想把phpcms的setcache和getcache方法,配置成可以动态切换缓存类型,类型于ThinkPHP的机制。
最后无奈发现phpcms默认开发好像全是使用文件进行存储。
于是,只能在自己需要的地方加上memcache或者redis了,内核要改的话,也忒麻烦了。
配置文件:
cache/configs/cache.php
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?phpreturn array ( 'file1' => array ( 'type' => 'file', 'debug' => true, 'pconnect' => 0, 'autoconnect' => 0 ), 'memcache' => array ( 'hostname' => '192.168.0.106', 'port' => 11211, 'timeout' => 3600, 'type' => 'memcache', 'debug' => true, 'pconnect' => 0, 'autoconnect' => 0 ), 'redis' => array ( 'hostname' => '192.168.0.106', 'port' => 6379, 'timeout' => 0, 'type' => 'redis', 'debug' => true, 'pconnect' => 0, 'autoconnect' => 0 ));?> |
文件配置文件的格式上看,和TP机乎一样,但不支持动态切换。
在需要的地方这样写,这里封装了一个获取记录的方法:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /** * 调用一个应用详情 */function appdetail($appid, $ttl=0){ if(FALSE == is_int($appid)) return FALSE; $cache_type = 'memcache'; $cache_name = sprintf("app_detail_id_%d", $appid); $cache_config = pc_base::load_config('cache'); /* 系统是否支持 */ $cache_support = !empty($cache_config[$cache_type]) && class_exists($cache_type); if($cache_support) { $memcache = cache_factory::get_instance($cache_config)->get_cache('memcache'); $app = $memcache->get($cache_name); $app = unserialize($app); }else{ $app = getcache($cache_name); } if($app === false) { $db = pc_base::load_model('apps_model'); $app = $db->get_one(array("id"=>$appid), "id,name"); if($cache_support) { $memcache = cache_factory::get_instance($cache_config)->get_cache('memcache'); $memcache->set($cache_name, serialize($app), $ttl); }else{ setcache($cache_name, $app, '', $ttl); } } return $app;} |
大约的功能是检测系统是否支持memcache类,支持的话就直接使用memcache,如果不支持,就使用PHPCMS自带的缓存方法。
继续深入折腾setcache,看看是不是我的理解有误。
周末在家折腾了一天,慢慢把PHPCMS的MVC和模板标签pc_tag给做熟了,可以肯定的下结论就是:
PHPCMS会把所有进入模板层的数据,进行数据缓存,比如content_tag.class.php中所有的方法,产生的数据还是会被再一次缓存到文件中。
我使用A机产生memcache的数据memcache_A1,使用PHPCMS调用A1以后,会在PHPCMS硬盘上产生PHPCMS_A1,当我的memcache_A1发生改变时,PHPCMS_A1读取的还是PHPCMS_A1这个缓存。
解决方是在pc_tag中,将缓存设置为0,则可以在后端使用其它缓存工具!
