本文文煞给大家分享个超实用的小技巧!是关于帝国CMS评论分表后,新评论实时更新memcached缓存的小技巧。用帝国CMS的小伙伴应该都碰到过这事儿:评论分表之后,新评论发出来了,但页面缓存没跟着更,显示的还是老内容?今天我就以memcached缓存为例,跟大家唠唠咋解决这个问题。
一、解决方法
首先呢,为了后续能反复用,咱先定义两个函数:一个是专门生成缓存的key键名,还有对应的SQL语句数组;另一个就很直白了,既然要更新缓存,把生成的这个key键名删掉就行,懂的都懂哈!
//生成评论分表缓存信息(缓存键值名+拼接SQL语句)
function getPlCacheKey($pldatatbs, $pubid, $order = '') {
global $dbtbpre, $public_r;
$biaoship = $public_r['add_pcurl'] ?: 'meiweny';
$biaoshi = str_replace(['http://','https://','/','www.','.'], "", $biaoship);
$fenbiaopl = explode(',', $pldatatbs);
$unionQuery = '';
for ($i = 1; $i < count($fenbiaopl)-1; $i++) {
$sql = "select plid, saytime, sayip, username, zcnum, fdnum, userid, saytext, fdnum, floornum, replypl from {$dbtbpre}enewspl_{$fenbiaopl[$i]} where pubid='$pubid'";
$unionQuery = $i == 1 ? $sql : $unionQuery . " union all " . $sql;
}
$finalSql = $unionQuery . $order;
$cacheKey = 'pc' . $biaoshi . '_pinglun_' . md5($finalSql);
return ['key' => $cacheKey,'sql' => $finalSql];
}
//删除评论分表缓存
function deletePlCache($cacheKey) {
global $memcache;
if ($memcache === null) {
echo "Error: Memcache实例为空!";
return false;
}
return $memcache->delete($cacheKey);
}这两个函数咱直接放到/e/class/userfun.php这个文件里就行,别放错地方啦~ 接下来该改评论发布的文件了,找到plfun.php,在里面找到ecmsEmptyShowKey($keyvname);//清空验证码`这行代码的下面,加上这些内容:
$hcpagenum = isset($_POST['hcpagenum']) ? (int)$_POST['hcpagenum'] : $public_r['pl_num']; $hcorder = ' order by plid desc limit 0,'.$hcpagenum; $hcResult = getPlCacheKey($plsetr['pldatatbs'], $pubid, $hcorder); deletePlCache($hcResult['key']);
然后还要处理多表读取的index.php文件,找到$order=" order by ".$addorder." limit $offset,$line";这行,在它下面加上这段代码:
$plsqlarray = getPlCacheKey($plr['pldatatbs'], $pubid, $order); $plSql = $plsqlarray['sql'];
干完这些事情之后,大概率就能完美解决帝国CMS评论分表后,有新评论时缓存自动更新的问题啦!>
二、知识总结
1. 核心思路是定义两个函数:getPlCacheKey生成缓存键名和SQL语句,deletePlCache删除指定缓存键;
2. 函数需放在/e/class/userfun.php,再分别修改plfun.php(评论发布文件)和index.php(多表读取文件)的指定位置;
3. 最终实现帝国CMS评论分表场景下,新评论发布时自动更新memcached缓存,解决缓存不刷新的问题。








