必须在消息生成后、发送前插入校验逻辑,不能依赖客户端拦截;定时推送需在timer回调内动态过滤,外部事件触发推送则应在接收端入口(如handlepublish)或控制通道onmessage中统一处理,敏感词库须预加载至内存。

要在Workerman主动推送消息前过滤敏感内容,必须在消息生成后、发送前插入校验逻辑,不能依赖客户端或前端拦截——因为推送路径绕过常规HTTP请求生命周期,直接走WebSocket或HTTP长连接通道。
在定时推送中嵌入内容过滤
若使用Timer::add定期广播,需把过滤逻辑写进回调函数内部:
第一步:定义敏感词数组或从Redis缓存加载(避免每次硬编码)
第二步:对要推送的字符串content调用过滤函数,替换或截断违规内容
第三步:仅当过滤后内容非空且未触发拦截规则时,才执行$connection->send();否则跳过该连接或发默认提示
注意:不要在onWorkerStart里一次性预过滤所有待推内容——定时器每秒触发,内容可能实时变化,必须每次动态校验。
在外部事件触发推送时过滤
当其它项目通过HTTP请求(如/web-sender接口)通知Workerman推送时,过滤必须落在接收端入口:
方法一:改写web-msg-sender的publish路由处理逻辑
打开web-msg-sender/src/Server.php,定位到handlePublish方法,在解析$content参数后、写入消息队列前插入cleanContent()调用
方法二:在调用方封装请求前预处理
这一步操作起来很简单,直接把待推送文本传给本地过滤函数,再拼进URL参数即可:【务必URL编码content字段,否则含&=等字符会导致参数截断】
方法三:用Workerman的onMessage钩子拦截推送指令
若你自建了控制通道(比如用TCP监听一个管理端口),可在$worker->onMessage中先parse_json→validate→filter→再转发给目标连接,这样能统一管控所有来源
实现一个轻量级敏感词过滤器
不依赖第三方扩展,用PHP内置函数快速落地:
① 建立敏感词库文件config/sensitive_words.php,返回索引数组,键为词,值为替换符(如'**')
② 编写filter_content()函数:用str_ireplace批量替换,再用preg_replace过滤连续空白和特殊符号组合(防绕过)
③ 关键判断:若原始content与过滤后结果长度差超过阈值(如30%),说明大量命中,应拒绝推送并记录告警日志
【禁止在过滤函数中使用file_get_contents读取词库——高频推送下IO会成为瓶颈,必须提前加载到内存】











