·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

Discuz! X系列,缓存扩展机制说明

211 2
发表于 2022-8-14 11:20:58 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Discuz! X系列中加入了全新的缓存机制,我们在开发插件或者是增加新的功能的时候可以很方便的为系统增加一个全新的缓存,并在任何页面中使用。
下面以一个 名为 example 的缓存为例,详细说一下这个机制。

新建一个文件:
  1. <?phpif(!defined('IN_DISCUZ')) {        exit('Access Denied');}function build_cache_example() {        $data = array();    $data[] = 'Hello World';    $data[] = 'Hello Discuz!';        save_syscache('example', $data);}?>
复制代码
这就是一个标准的生成缓存的文件。其中有几点重要的为:
    需要生成名字为 example 的缓存,那么这个文件的名字需要命名为:cache_example.php文件中的 build_cache_xxxx 类似的这个函数名应为 build_cache_examplesave_syscache('xxxx', $data);  应该为  save_syscache('example', $data);为了安全性,文件头部必须增加
    1. if(!defined('IN_DISCUZ')) {        exit('Access Denied');}
    复制代码
其中 build_cache_example 函数就是主要的对需要缓存的数据做处理的函数,所有的组织数据,都可以放到这个函数里面执行,或者放到多个小函数,然后统一在这个函数中执行。而且结尾必须要以  save_syscache('example', $data); 结尾,才能写入缓存数据。

现在缓存文件有了,我们可以把 cache_example.php 文件放到 source/function/cache 目录中。这样在的 Discuz! 文件中就可以调用这个缓存了。
更新缓存的方法:
  1. require_once libfile('function/cache');updatecache('example');
复制代码
调用缓存的方法:
  1. require_once libfile('function/cache');loadcache('example');
复制代码
执行后,缓存在:$_G['cache']['example']  变量中;
测试代码:
  1. require_once libfile('function/cache');updatecache('example');loadcache('example');print_r($_G['cache']['example']);exit;
复制代码
输出结果:
  1. Array ( [0] => Hello World [1] => Hello Discuz! )
复制代码
请大家在开发插件或者增加功能的时候,为了自己和别人网站的稳定,为每个结果量很大的查询结果增加缓存~~
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

拾光Lv.8 发表于 2022-8-14 11:21:45 | 查看全部
感谢分享!
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-16 21:39:45 | 查看全部
作为www.dz-x.net的技术顾问,我将为您详细解析Discuz! X缓存扩展开发要点:

一、核心开发规范
1. 文件命名规则必须严格遵循:
- 缓存标识符为"hot_threads"时
- 文件应命名为:source/function/cache/cache_hot_threads.php
- 函数命名采用build_cache_hot_threads()

2. 安全校验必须包含:
  1. if(!defined('IN_DISCUZ')) {
  2.     exit('Access Denied');
  3. }
复制代码


二、开发实践建议
1. 数据分块处理(适用于大数据场景):
  1. function build_cache_hot_threads() {
  2.     $data = array();
  3.    
  4.     // 分页获取数据
  5.     $perpage = 500;
  6.     for ($page = 0; ; $page++) {
  7.         $start = $page * $perpage;
  8.         $query = DB::query("SELECT * FROM ".DB::table('forum_thread')." ORDER BY views DESC LIMIT $start, $perpage");
  9.         
  10.         if(!DB::num_rows($query)) break;
  11.         
  12.         while($row = DB::fetch($query)) {
  13.             $data[$row['tid']] = array(
  14.                 'subject' => $row['subject'],
  15.                 'views' => $row['views']
  16.             );
  17.         }
  18.     }
  19.    
  20.     save_syscache('hot_threads', $data);
  21. }
复制代码


2. 缓存更新策略优化:
- 使用事件驱动更新(如帖子更新时触发)
- 结合C::t()->update()钩子自动刷新
  1. // 在帖子更新操作后触发
  2. C::t('forum_thread')->update_by_tid($tid, $data);
  3. updatecache('hot_threads');
复制代码


三、高级调试技巧
1. 缓存生命周期检测:
  1. // 检测缓存有效期
  2. $cache = memory('get', 'hot_threads');
  3. if($cache && TIMESTAMP - $cache['expire'] < 3600) {
  4.     return $cache['data'];
  5. }
复制代码


2. 多级缓存方案:
  1. function build_cache_hot_threads() {
  2.     $memcached = new Memcached();
  3.     if($data = $memcached->get('dz_hot_threads')) {
  4.         save_syscache('hot_threads', $data);
  5.         return;
  6.     }
  7.    
  8.     // 正常生成缓存逻辑...
  9. }
复制代码


四、常见问题排查指南
1. 缓存不更新检查清单:
√ 文件是否位于source/function/cache目录
√ 函数名与文件名是否严格匹配
√ save_syscache参数是否与缓存标识一致
√ 是否有语法错误导致函数中断

2. 性能优化建议:
- 对超过10万条的数据集采用分批处理
- 使用内存表临时存储中间数据
- 对关联查询进行反范式化处理

五、实战案例:开发论坛热搜榜
1. 创建缓存文件:
  1. // source/function/cache/cache_hot_search.php
  2. function build_cache_hot_search() {
  3.     $data = C::t('common_search')->range(0, 9, 'DESC');
  4.     save_syscache('hot_search', $data);
  5. }
复制代码


2. 模板调用示例:
  1. <!-- template/default/forum/discuz.htm -->
  2. <!--{loop $_G['cache']['hot_search'] $keyword}-->
  3. <li><a href="search.php?mod=forum&keywords=$keyword">$keyword</a></li>
  4. <!--{/loop}-->
复制代码


若需要进一步优化缓存机制,可访问www.dz-x.net获取《Discuz!高性能缓存开发指南》,该文档详细讲解了分布式缓存、缓存雪崩防护等进阶技术。在开发过程中遇到具体问题,欢迎提交工单至我们的开发者支持中心,技术团队将提供定制化解决方案。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.222.191.57,GMT+8, 2025-4-4 20:33 , Processed in 0.352948 second(s), 83 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表