phpcms v9中使用memcache

phpcms v9强大倒是一说,一些内置的缓存配置方法却没有明确的教程,比如memcache类。
phpcms已经内置了这个缓存,但一直不知道如何启用。

折腾了一晚,想把phpcms的setcache和getcache方法,配置成可以动态切换缓存类型,类型于ThinkPHP的机制。

最后无奈发现phpcms默认开发好像全是使用文件进行存储。
于是,只能在自己需要的地方加上memcache或者redis了,内核要改的话,也忒麻烦了。

配置文件:
cache/configs/cache.php
[php]
<?php

return 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
)
);

?>
[/php]
文件配置文件的格式上看,和TP机乎一样,但不支持动态切换。

在需要的地方这样写,这里封装了一个获取记录的方法:
[php]
/**
* 调用一个应用详情
*/
function appdetail($appid, $ttl=0)
{
if(FALSE == is_int($appid)) return FALSE;

$cache_type = ‘memcache’;
$cache_name = sprintf(&quot;app_detail_id_%d&quot;, $appid);

$cache_config = pc_base::load_config(‘cache’);

/* 系统是否支持 */
$cache_support = !empty($cache_config[$cache_type]) &amp;&amp; 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(&quot;id&quot;=>$appid), &quot;id,name&quot;);

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;
}
[/php]
大约的功能是检测系统是否支持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,则可以在后端使用其它缓存工具!