1. 程式人生 > >PHP實現敏感詞過濾系統

PHP實現敏感詞過濾系統

trie樹 sel 重復 .html ole lang 最大 foreach header

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 ([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實現敏感詞過濾系統