Ускоряем работу DLE : тег catlist

Ускоряем работу DLE : тег catlist

Стандартно DLE использует проверку на поиск в массиве функцию in_array которая сама по себе "медленная". Хак поможет использовать проверку по ключу через isset, что немного быстрее.


Вот так выполняется код DLE для новостей, которые используют тег [catlist в обширном количестве:
[catlist=1,2,3,4,5,6,7,8,9,10,11]1[/catlist]
[catlist=2]2[/catlist]
[catlist=3]3[/catlist]
[catlist=4]4[/catlist]
[catlist=5]5[/catlist]
[catlist=6]6[/catlist]
[catlist=7]7[/catlist]
[catlist=8]8[/catlist]
[catlist=9]9[/catlist]
[catlist=10]10[/catlist]
[catlist=11]11[/catlist]

И с таким набором категорий у новостей:


А вот так с новым кодом:

Теперь давайте подумаем, а что если у нас на одной странице порядка 30 новостей, включая custom, и используется везде тег [catlist. Согласен нагрузка не большая, но оптимизация всегда нужна.

Установка:
1. Открыть engine/modules/functions.php и найти:
function check_category( $matches=array() ) {

Добавить выше:
function check_catlist( $matches=array(), $cat_list ) {
    $cat_list = array_flip($cat_list);
    if($matches[1] == "catlist")
        $action = true;
    else
        $action = false;
    if(substr_count($matches[2],","))
    {
        $cat_array = explode(",", $matches[2]);
        foreach($cat_array as $value)
        {
            if(isset($cat_list[$value]))
                if($action)
                    return $matches[3];
                else
                    return "";
        }
    }
    else
    {
         if(isset($cat_list[$matches[2]]))
            if($action)
                return $matches[3];
            else
                return "";
    }
    if($action)
        return "";
    else
        return $matches[3];
}

2. Открыть engine/modules/show.short.php, show.full.php, show.custom.php и найти:
if( strpos( $tpl->copy_template, "[catlist=" ) !== false ) {
    $tpl->copy_template = preg_replace_callback ( "#\\[(catlist)=(.+?)\\](.*?)\\[/catlist\\]#is", "check_category", $tpl->copy_template );
}

if( strpos( $tpl->copy_template, "[not-catlist=" ) !== false ) {
    $tpl->copy_template = preg_replace_callback ( "#\\[(not-catlist)=(.+?)\\](.*?)\\[/not-catlist\\]#is", "check_category", $tpl->copy_template );
}

Заменить на:
if( strpos( $tpl->copy_template, "[catlist=" ) !== false ) {
    $tpl->copy_template = preg_replace_callback ( "#\\[(catlist)=(.+?)\\](.*?)\\[/catlist\\]#is", function($data) use ($cat_list)
    {
        return check_catlist($data, $cat_list);
    }, $tpl->copy_template );
}

if( strpos( $tpl->copy_template, "[not-catlist=" ) !== false ) {
    $tpl->copy_template = preg_replace_callback ( "#\\[(not-catlist)=(.+?)\\](.*?)\\[/not-catlist\\]#is", function($data) use ($cat_list)
    {
        return check_catlist($data, $cat_list);
    }, $tpl->copy_template );
}

Готово!
 
Версия DLE: 11.х
Автор: PunPun
Источник
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.