PHP實現敏感詞過濾系統
阿新 • • 發佈:2017-08-10
trie樹 sel 重復 .html ole lang 最大 foreach header
PHP實現敏感詞過濾系統
安裝說明
-
安裝PHP擴展 trie_filter,安裝教程 http://blog.41ms.com/post/39.html
-
安裝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 ([email protected])
*/
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
PHP實現敏感詞過濾系統