Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2010-11-15 14:19:26

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

MOD: Кэширование цензурируемых слов

В файле functions.php меняем ф-ию censor_words() на эту:

function censor_words($text)
{
    global $db;
    static $search_for, $replace_with;

    // If not already built in a previous call, build an array of censor words and their replacement text
    if (!isset($search_for))
    {
        if (file_exists(FORUM_CACHE_DIR.'cache_censor.php'))
            include FORUM_CACHE_DIR.'cache_censor.php';

        if (!defined('PUN_CENSOR_LOADED'))
        {
            if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
                require PUN_ROOT.'include/cache.php';

            generate_censor_cache();
            require FORUM_CACHE_DIR.'cache_censor.php';
        }
    }

    if (!empty($search_for))
        $text = substr(preg_replace($search_for, $replace_with, ' '.$text.' '), 1, -1);

    return $text;
}

В файл cache.php добавляем новую ф-ию кэширования:

//
// Generate the censor cache PHP script - Visman
//
function generate_censor_cache()
{
    global $db;

    $result = $db->query('SELECT search_for, replace_with FROM '.$db->prefix.'censoring') or error('Unable to fetch censor word list', __FILE__, __LINE__, $db->error());
    $num_words = $db->num_rows($result);

    $search_for = $replace_with = array();
    for ($i = 0; $i < $num_words; ++$i)
    {
        list($search_for[$i], $replace_with[$i]) = $db->fetch_row($result);
        $search_for[$i] = '/(?<=\W)('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')(?=\W)/i';
    }

    // Output config as PHP code
    $fh = @fopen(FORUM_CACHE_DIR.'cache_censor.php', 'wb');
    if (!$fh)
        error('Unable to write censor cache file to cache directory. Please make sure PHP has write access to the directory \'cache\'', __FILE__, __LINE__);

    fwrite($fh, '<?php'."\n\n".'define(\'PUN_CENSOR_LOADED\', 1);'."\n\n".'$search_for = '.var_export($search_for, true).';'."\n\n".'$replace_with = '.var_export($replace_with, true).';'."\n\n".'?>');

    fclose($fh);

    if (function_exists('apc_delete_file'))
        @apc_delete_file(FORUM_CACHE_DIR.'cache_censor.php');
}

В файле admin_censoring.php перед строчками содержащими redirect('admin_censoring.php', (3 раза я насчитал) добавляем такие блоки:

    // Regenerate the bans cache
    if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
        require PUN_ROOT.'include/cache.php';

    generate_censor_cache();

Все!
Те кто использует цензуру на своем форуме получают экономию в один запрос к базе на каждом открытии страницы форума.
З.Ы. Будет включен в мою сборку начиная с ревизии 30.

Offline

#2 2010-11-15 20:01:04

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: MOD: Кэширование цензурируемых слов

Мод будет включен в движок официально в версии 1.4.4
http://fluxbb.org/development/core/tickets/190/

Offline

#3 2010-11-15 20:22:02

Scaf
Участник
Зарегистрирован: 2010-11-03
Сообщений: 60

Re: MOD: Кэширование цензурируемых слов

Visman мои поздравление!
Давай твори и не останавливайся!  smile
Плоды твои не останутся незамеченными!  wink

Offline

#4 2010-11-25 19:53:12

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Re: MOD: Кэширование цензурируемых слов

Visman, мож ты заодно и объединение нецензурщины разных языков сделаешь?

Offline

#5 2010-11-25 20:35:44

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: MOD: Кэширование цензурируемых слов

Freeman, а чего там делать?
Для того, чтобы регистр не учитывался нужно сменить

        $search_for[$i] = '/(?<=\W)('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')(?=\W)/i';

на

        $search_for[$i] = '/(?<=\W)('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')(?=\W)/iu';

Или взять вариант, который предложил artoodetoo.
По умолчанию вся нецензурщина заносится в один список с самого начала.

Offline

#6 2010-11-25 20:39:20

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Re: MOD: Кэширование цензурируемых слов

Да, я с шумовыми словами перепутал. sad

Offline

#7 2010-11-25 21:15:13

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: MOD: Кэширование цензурируемых слов

Freeman пишет:

Да, я с шумовыми словами перепутал. sad

Я их собрал в кучу в 30 ревизии.

Offline

#8 2010-11-26 00:27:14

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Re: MOD: Кэширование цензурируемых слов

Все же кажется не совсем логически верным. Собирать должен компьютер, а не человек. Оффтопик. smile

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens