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

PunPun

Coder
Команда форума
Приватовец
Регистрация
23 Фев 2017
Сообщения
618
Реакции
402
Баллы
63
Стандартно 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]
И с таким набором категорий у новостей
upload_2017-5-20_11-1-59.png
upload_2017-5-20_10-39-46.png
А вот так с новым кодом
upload_2017-5-20_10-40-50.png
Теперь давайте подумаем, а что если у нас на одной странице порядка 30 новостей, включая custom, и используется везде тег [catlist. Согласен нагрузка не большая, но оптимизация всегда нужна.

Для этого нужно сделать:
1. Открываем /engine/modules/functions.php и находим код
PHP:
function check_category( $matches=array() ) {
Выше вставляем
PHP:
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 находим
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 );
}
Меняем на
PHP:
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 );
}
Вот и все.
Автор: https://punpun.name/ (я)
 

alexbik

Новичок
Регистрация
2 Апр 2017
Сообщения
67
Реакции
9
Баллы
8
Сайт действительно прибавил по тестам, а на глаз не ощутил наверное интернет нормальный на 150 мег
 

Romantv

Новичок
Регистрация
27 Фев 2017
Сообщения
957
Реакции
358
Баллы
63
вот тут есть катлист тег. это уже когда хак поставил.а до него кароче там еще дохуя запросов было,я так понял этот хак их убрал запросы.сайт дествительно стал быстрее загружатся
upload_2017-5-21_19-48-54.png
 

Romantv

Новичок
Регистрация
27 Фев 2017
Сообщения
957
Реакции
358
Баллы
63
в версии 12.1 этот
Код:
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 );
}
встречается два раза,надо заменить все два раза?
 

ettochno

VIP
VIP
Регистрация
5 Апр 2017
Сообщения
47
Реакции
13
Баллы
8
Конечно визуально не заметно, но у PunPun глаз набит - ему верю :biggrinn:
 

BratPirat

Новичок
Регистрация
27 Фев 2017
Сообщения
14
Реакции
3
Баллы
3
Обратите внимание, что если вы хотите заключить сделку с этим пользователем, он заблокирован
dle 12.1 в show.full.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 );
}
повторяется! Два раза менять этот код или этот хак уже не актуален?
 

Wodooo

Новичок
Регистрация
25 Фев 2017
Сообщения
93
Реакции
43
Баллы
18
dle 12.1 в show.full.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 );
}
повторяется! Два раза менять этот код или этот хак уже не актуален?
@PunPun подскажите надо ли два раза менять ? И как быть если стоит Ваш хак ?
 
Последнее редактирование:
Сверху Снизу