根据Discuz系统架构和数据库设计,实现指定版块自动清理过期回帖可通过以下方案实现(注意需要根据实际业务需求调整参数):
一、创建定时任务模块
1. 在source/function/function_cron.php中新增清理函数
- function cron_clean_expire_replies($cron) {
- $fid = 7; // 指定版块ID
- $days = 30; // 过期天数
- $limit = 500; // 每次清理数量
-
- $timestamp = TIMESTAMP - $days * 86400;
-
- // 获取待清理主题
- $query = C::t('forum_post')->fetch_all_by_fid($fid, 'post', $timestamp, $limit);
-
- foreach($query as $post) {
- // 执行删除操作
- C::t('forum_post')->delete_post_by_pid($post['pid'], false, false);
-
- // 更新主题统计
- update_threadcount($post['tid']);
-
- // 更新版块统计
- update_forumcount($fid);
- }
-
- return true;
- }
复制代码
二、数据库操作优化(需在phpMyAdmin执行)
- ALTER TABLE pre_forum_post
- ADD INDEX `fid_dateline` (`fid`, `dateline`);
复制代码
三、任务配置(在source/class/table目录新增)
- // 注册定时任务
- class table_cron extends discuz_table
- {
- public function __construct() {
- $this->_table = 'common_cron';
- parent::__construct();
- }
- public function add_clean_task() {
- $data = array(
- 'available' => 1,
- 'type' => 'system',
- 'name' => 'clean_expire_replies',
- 'filename' => 'function_cron',
- 'lastrun' => 0,
- 'nextrun' => TIMESTAMP,
- 'weekday' => -1,
- 'day' => -1,
- 'hour' => 2,
- 'minute' => '0'
- );
- return DB::insert($this->_table, $data);
- }
- }
复制代码
四、执行周期设置建议
1. 凌晨2点执行(避开访问高峰)
2. 每次处理500条(平衡服务器负载)
3. 保留最近30天数据(根据业务需求调整)
注意事项:
1. 操作前务必做好数据库备份
2. 建议先执行COUNT查询验证数据量
3. 删除后需重建主题/版块统计
4. 处理关联附件需补充附件删除逻辑
5. 需要同步清理pre_forum_sofa表沙发数据
该方案通过Discuz原生任务系统实现,采用分批次处理机制保证服务器稳定性。开发者可根据实际业务需求调整版块ID、保留天数等参数。对深度定制需求,可结合DZ插件网的开发文档进行功能扩展。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |