PHP实现敏感词过滤系统

PHP实现敏感词过滤系统

安装说明

  1. 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html

  2. 安装PHP扩展 swoole,安装教程 http://www.swoole.com/

 

代码说明

 

1、敏感词库维护更新脚本:

reload_dict.php,提供自动更新字典库到trie-tree文件的过程

PHP
<?php// 设置内存
ini_set('memory_limit', '128M'); // 读取敏感词字典库 $handle = fopen('dict.txt', 'r'); // 生成空的trie-tree-filter $resTrie = trie_filter_new(); while(! feof($handle)) { $item = trim(fgets($handle)); if (empty($item)) { continue; } // 把敏感词逐个加入trie-tree trie_filter_store($resTrie, $item); } // 生成trie-tree文件 $blackword_tree = 'blackword.tree'; trie_filter_save($resTrie, $blackword_tree);

 

2、trie树对象获取工具类

FilterHelper.php,提供获取trie-tree对象,避免重复生成trie-tree对象和保证tree文件与敏感词库的同步更新

PHP
<?php
/*** 过滤器助手** getResTrie 提供trie-tree对象;* getFilterWords 提取过滤出的字符串** @author W.Y.P (wangyupeng@jiayuan.com)*/class FilterHelper { // trie-tree对象 private static $_resTrie = null; // 字典树的更新时间 private static $_mtime = null; /** * 防止初始化 */ private function __construct() {} /** * 防止克隆对象 */ private function __clone() {} /** * 提供trie-tree对象 * * @param $tree_file 字典树文件路径 * @param $new_mtime 当前调用时字典树的更新时间 * @return null */ static public function getResTrie($tree_file, $new_mtime) { if (is_null(self::$_mtime)) { self::$_mtime = $new_mtime; } if (($new_mtime != self::$_mtime) || is_null(self::$_resTrie)) { self::$_resTrie = trie_filter_load($tree_file); self::$_mtime = $new_mtime; // 输出字典文件重载时间 echo date('Y-m-d H:i:s') . "\tdictionary reload success!\n"; } return self::$_resTrie; } /** * 从原字符串中提取过滤出的敏感词 * * @param $str 原字符串 * @param $res 1-3 表示 从位置1开始,3个字符长度 * @return array */ static public function getFilterWords($str, $res) { $result = array(); foreach ($res as $k => $v) { $word = substr($str, $v[0], $v[1]); if (!in_array($word, $result)) { $result[] = $word; } } return $result; } }

 

3、对外提供过滤HTTP访问接口

filter.php,使用swool,对外提交过滤接口访问

PHP
<?php// 设置脚本最大运行内存,根据字典大小调整
ini_set('memory_limit', '512M'); // 设置时区 date_default_timezone_set('Asia/Shanghai'); // 加载助手文件 require_once('FilterHelper.php'); // http服务绑定的ip及端口 $serv = new swoole_http_server("182.92.177.16", 9502); /** * 处理请求 */ $serv->on('Request', function($request, $response) { // 接收get请求参数 $content = isset($request->get['content']) ? $request->get['content']: ''; $result = ''; if (!empty($content)) { // 字典树文件路径,默认当时目录下 $tree_file = 'blackword.tree'; // 清除文件状态缓存 clearstatcache(); // 获取请求时,字典树文件的修改时间 $new_mtime = filemtime($tree_file); // 获取最新trie-tree对象 $resTrie = FilterHelper::getResTrie($tree_file, $new_mtime); // 执行过滤 $arrRet = trie_filter_search_all($resTrie, $content); // 提取过滤出的敏感词 $a_data = FilterHelper::getFilterWords($content, $arrRet); $result = json_encode($a_data); } // 定义http服务信息及响应处理结果 $response->cookie("User", "W.Y.P"); $response->header("X-Server", "W.Y.P WebServer(Unix) (Red-Hat/Linux)"); $response->header('Content-Type', 'Content-Type: text/html; charset=utf-8'); $response->end($result); }); $serv->start();

 

测试效果

词库内容:

 

接口响应过滤结果:

尝试更新敏感词库,接口程序已自动加载最新敏感词库,保证过滤效果

ab测试结果

词库:200W敏感词

服务器配置(CPU:1核;内存:1024 MB;带宽:1Mbps)

 

http://www.cnblogs.com/paulversion/p/7150391.html

转载于:https://www.cnblogs.com/lixiuran/p/7338564.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hbase集群监控

Hbase集群监控 Hbase Jmx监控 监控每个regionServer的总请求数&#xff0c;readRequestsCount&#xff0c;writeRequestCount&#xff0c;region分裂&#xff0c;region合并&#xff0c;Store 数据来源&#xff1a; /jmx?qryHadoop:serviceHBase,nameRegionServer,subServer 设…

学校计算机二级模拟上机能看分数吗,全国计算机二级考试机试考完怎么储存的...

全国计算机二级考试机试考完怎么储存的以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;全国计算机二级考试机试考完怎么储存的自动储存在系统里面&#xff0c;考试结束后上传&#xff0c;分数…

宝塔面板 创建 二级域名 Unable to round-trip http request to upstream

1、我的服务器是阿里云&#xff0c;安装了宝塔面板&#xff0c;直接使用宝塔面板创建二级域名bike.caowei.wang。 2、然后就想访问了&#xff0c;对不起&#xff0c;直接给你报错Unable to round-trip http request to upstream: dial tcp: lookup bike.caowei.wang: no suc…

CentOS环境下tomcat启动超级慢的解决方案

tomcat日志中的其中一行: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [341,502] milliseconds 总启动时间: INFO: Starting ProtocolHandler ["http-bio-8080"] Aug 05, 2017 12:11:35 PM org.apache.coyote.AbstractProto…

计算机准考证打印山东省招生教育,山东省教育招生考试院2020高考准考证打印入口:wsbm.sdzk.cn...

免费申请学习规划请选择在读年级学前小学初中高中大学留学其他已为30154位学员提供学习规划*验证码*短信验证码{"text1":{"label":"薄弱科目","placeholder":"请输入你的薄弱科目","required":1,"formType&q…

webpack-dev-server 本地文件 发布 网站 域名 根目录

我在做微信开发的时候&#xff0c;官方要求能在网站根域名下访问一下鉴权文件。说白了&#xff0c;就是根目录下可以直接访问资源。所以我们需要copy-webpack-plugin这个包。 1、首先引入 const CopyWebpackPlugin require(copy-webpack-plugin) 2、配置toType: file ne…

Java 同步器

CyclicBarrier是什么 CyclicBarrier也叫同步屏障&#xff0c;在JDK1.5被引入&#xff0c;可以让一组线程达到一个屏障时被阻塞&#xff0c;直到最后一个线程达到屏障时&#xff0c;所以被阻塞的线程才能继续执行。CyclicBarrier好比一扇门&#xff0c;默认情况下关闭状态&#…

mongoose populate 返回 指定 字段

1、mongoose中一个数据模型Product(商品)关联另外一个数据模型Brand(品牌)需要使用ref&#xff0c;关联查询使用populate Product模型 new mongoose.Schema({// 商品名称name: { type: String, required: true, validate: /\S/ },// 商品内容content: { type: String, requir…

凯斯西储大学计算机工程排名,[转载]凯斯西储大学排名及世界排名【研究生】...

商学院工商管理托福90分或雅思7分&#xff0c;GMAT&#xff0c;GPA要求3.0以上&#xff0c;学费$37,500/年&#xff0c;申请截止日期6月1日会计托福100分或雅思7分&#xff0c;GMAT&#xff0c;GMAT阅读百分比排名在50%以上&#xff0c;写作在4.0分以上&#xff0c;GPA要求2.0以…

SMB MS17-010 利用(CVE-2017-0144 )

exploit-db : https://www.exploit-db.com/exploits/42315/ 该漏洞的影响版本很广泛&#xff1a;Microsoft Windows Windows 7/8.1/2008 R2/2012 R2/2016 R2 - EternalBlue SMB Remote Code Execution (MS17-010) 具体请查看公告&#xff1a;Microsoft 安全公告 MS17-010 - 严重…

麻省理工学院计算机专业2018,麻省理工学院专业排名一览及最强专业推荐(QS世界大学排名)...

麻省理工学院优势专业介绍电子工程、机械工程、物理学、化学、经济学、哲学、政治学?麻省理工学院专业排名麻省理工学院会计与金融专业在2018年QS世界排名中排名第2麻省理工学院建筑专业在2018年QS世界排名中排名第1麻省理工学院艺术与设计专业在2018年QS世界排名中排名第4麻省…

nuxt route 全局管理 route.beforeEach 替代

在使用nuxt之前&#xff0c;我们正常的route控制语法如下&#xff1a; const route new Router({routes:{[...]} })route.beforeEach(to,from,next){//进行路由权限校验等方法 } 而使用nuxt&#xff0c;路由默认会根据页面的路径规则自动生成&#xff0c;所以乍一看根本没有…

计算机硬盘的主流型号,四款主流2.5英寸笔记本机械硬盘性能对比

虽说固态硬盘已经逐渐成为了主流&#xff0c;但是对于普通的笔记本用户来说&#xff0c;传统的2.5英寸机械硬盘则是笔记本扩容的首选&#xff0c;毕竟现在一款1TB的笔记本机械硬盘价格不到400元&#xff0c;而1TB的固态硬盘无论是什么接口&#xff0c;价格都能买好几个机械硬盘…