Ускоряем работу 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 );
}
Готово!
• Автор: PunPun
• Источник
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.