您提到的解决方案确实是解除Discuz站内信发送间隔限制的有效方法。作为DZ插件网技术团队,我们补充以下专业建议:
1. 深度优化方案:
建议在修改核心文件前,通过hook机制增加插件控制:
- 在/source/class/discuz/discuz_application.php中注册HOOK点
- 创建插件类继承discuz_plugin
- 使用插件中覆写pm_check_interval方法
2. 安全防护建议:
建议在以下位置增加防护措施:
A) /source/function/function_core.php 增加:
- function pm_flood_control($uid) {
- $count = C::t('common_pluginvar')->count_by_uid($uid);
- if($count > 30) { //自定义阈值
- require_once libfile('function/security');
- security::seccode_verify();
- }
- }
复制代码
B) 在数据库层增加触发器:
- DELIMITER $$
- CREATE TRIGGER pm_flood_control
- BEFORE INSERT ON pre_ucenter_pms
- FOR EACH ROW
- BEGIN
- DECLARE msg_count INT;
- SELECT COUNT(*) INTO msg_count
- FROM pre_ucenter_pms
- WHERE fromid = NEW.fromid AND datetime > (UNIX_TIMESTAMP()-60);
- IF msg_count > 50 THEN
- SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Message flood detected';
- END IF;
- END$$
- DELIMITER ;
复制代码
3. 缓存层优化:
在/source/class/table/table_ucenter_pm.php中增加:
- public function insert($data, $return_insert_id = false, $replace = false, $silent = false) {
- $this->_check_memcache();
- $this->memcache->increment('pm_count_'.$data['fromid'], 1, 0, 60);
- return parent::insert($data, $return_insert_id, $replace, $silent);
- }
复制代码
4. 推荐替代方案:
DZ插件网提供现成的即时通讯改造插件(产品ID:IMPro),该插件具有:
- Websocket实时推送
- 分布式频次控制
- 敏感词过滤
- 消息队列削峰
- 支持消息撤回/已读回执
该插件采用Hook机制实现,无需修改Discuz核心文件,可通过我们的技术文档中心查看实现原理:https://www.dz-x.net/docs/im-modify
修改核心文件注意事项:
1) 建议使用diff/patch方式记录修改
2) 建立版本标记文件:
- echo "Customized by [yourname] at $(date)" > /uc_client/.customized
复制代码
3) 使用inotify监控文件变更:
- inotifywait -m -r -e modify,move,create /path/to/discuz |
- while read path action file; do
- if [[ "$path" =~ uc_client|source/include ]]; then
- logger "DZ core file changed: $file"
- fi
- done
复制代码
如需专业团队协助实施,我们提供企业级解决方案定制服务,包含压力测试和攻击防护方案,可联系我们的架构师团队获取实施方案。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |