Новости Joomla

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

👩‍💻 Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях. На старте его сайт на Joomla 3 вообще не смог обновиться на Joomla 5. Пришлось делать экспорт/импорт материалов. Проделав всё это он запустил-таки этот объём данных на Joomla 5. Тестовый скрипт грузил 200 материалов из этого объёма всего за 94 секунды ))) А главная страница с категориями грузилась 20 секунд. Добавив индекс для таблицы #__content

CREATE INDEX idx_catid_state ON #__content (catid, state);
он сократил время загрузки категорий до 1 секунды. Затем наш герой решил поковырять SQL-запрос в ArticleModel, который отвечает за выборку материалов. И решил заменить тип JOIN на STRAIGHT_JOIN для категорий.
// ->from($db->quoteName('#__content', 'a'))->from(    $db->quoteName('#__content', 'a')    . ' STRAIGHT_JOIN ' . $db->quoteName('#__categories', 'c')    . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))// ->join('LEFT', $db->quoteName('#__categories', 'c'), $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))
Что сократило загрузку 200 материалов из 150к с 94 секунд до 5. К слову сказать, боевой сайт на Joomla 3 крутится на 12CPU 64GB рамы. А все манипуляции с кодом он делает на базовом 1CPU 1GB сервере и замеры скорости даны именно для базового сервера. Но это всё в дискуссии, хотя в идеале должно вылиться в Pull Requests. Мы - Open Source сообщество, где никто никому ничего не должен. Джунгли. Но человек ищет пути оптимизации Joomla и предлагает решения. Если оказать поддержку и предложить помощь хотя бы с тестированием самых разнообразных сценариев, то возможно эти улучшения смогут войти в ядро. Пусть не быстро, пусть через несколько лет, пусть не все, но войдут. Достаточно предложить руку помощи и приложить немного усилий.
Дискуссию на GitHub можно почитать здесь.@joomlafeed#joomla #community #php

0 Пользователей и 1 Гость просматривают эту тему.
  • 9 Ответов
  • 3259 Просмотров
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Помогите прикрутить пагинацию. Делаю в общем вот так:

Код
$db =& JFactory::getDBO();

$lim   = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 2, 'int'); //I guess getUserStateFromRequest is for session or different reasons
$lim0  = JRequest::getVar('limitstart', 0, '', 'int');
$db->setQuery('SELECT id, title FROM #__catalog_cat_id WHERE id ',$lim0, $lim);
$rL=&$db->loadAssocList();
if (empty($rL)) {$jAp->enqueueMessage($db->getErrorMsg(),'error'); return;} 
else {
////Here the beauty starts
$db->setQuery('SELECT id, title FROM #__catalog_cat_id');  //no reloading the query! Just asking for total without limit
jimport('joomla.html.pagination');
$pageNav = new JPagination( $db->loadResult(), $lim0, $lim );

echo '<table width="100%" border="0" cellspacing="2" cellpadding="5">';
foreach($rL as $r) {
echo '
<tr bgcolor="#f4f4f4">
    <td  bgcolor="#f4f4f4">'.$r['title'].'</td>
    <td width="100" bgcolor="#f4f4f4" align="center">
<a href="index.php?option=com_hello&view=hello&layout=view_cat&del='.$r['id'].'" >Удалить</a>
</td>
    <td width="100" bgcolor="#f4f4f4" align="center">
<a href="index.php?option=com_hello&view=hello&layout=view_cat&id='.$r['id'].'" >Редактировать</a>
</td>
</tr>';

}
echo '</table>';
}
echo $pageNav->getListFooter(); //Displays a nice footer



но почему то не выводиться не могу понять. Помогите пожалуйста разжуйте если не сложно?
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: Пагинация для компонента.
« Ответ #1 : 21.09.2010, 18:35:05 »
1. переменная $option не объявленная, зачем ее тогда использовать?
2. данные limit и limitstart должны передаваться post или get методом. У вас же не одной формы нет, с чего она будет работать?
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Re: Пагинация для компонента.
« Ответ #2 : 21.09.2010, 19:32:58 »
Я так понимаю что все вот это хозяйство
Код
$db =& JFactory::getDBO();

        $lim   = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 2, 'int'); //I guess getUserStateFromRequest is for session or different reasons
        $lim0  = JRequest::getVar('limitstart', 0, '', 'int');
        $db->setQuery('SELECT id, title FROM #__catalog_cat_id WHERE id ',$lim0, $lim);
        $rL=&$db->loadAssocList();
        if (empty($rL)) {$jAp->enqueueMessage($db->getErrorMsg(),'error'); return;} 
        else {
        ////Here the beauty starts
        $db->setQuery('SELECT id, title FROM #__catalog_cat_id');  //no reloading the query! Just asking for total without limit
        jimport('joomla.html.pagination');
        $pageNav = new JPagination( $db->loadResult(), $lim0, $lim );
       
        echo '<table width="100%" border="0" cellspacing="2" cellpadding="5">';
        foreach($rL as $r) {
        echo '
        <tr bgcolor="#f4f4f4">
                <td  bgcolor="#f4f4f4">'.$r['title'].'</td>
                <td width="100" bgcolor="#f4f4f4" align="center">
             <a href="index.php?option=com_hello&view=hello&layout=view_cat&del='.$r['id'].'" >Удалить</a>
             </td>
                <td width="100" bgcolor="#f4f4f4" align="center">
             <a href="index.php?option=com_hello&view=hello&layout=view_cat&id='.$r['id'].'" >Редактировать</a>
             </td>
         </tr>';
       
        }
        echo '</table>';
        }
        echo $pageNav->getListFooter(); //Displays a nice footer
Надо заключить в тег
Код
<form method="get"></form>
я правильно понял?
И еще моя конструкция работает иногда но появляется лишняя страница которая не куда не ведет и выдает ошибку.  Если не трудно напишите правильный вариант. сам догнать еще не могу!
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Re: Пагинация для компонента.
« Ответ #3 : 22.09.2010, 11:55:32 »
Я так и не понял пояснить сможете!
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: Пагинация для компонента.
« Ответ #4 : 22.09.2010, 12:39:02 »
Я так и не понял пояснить сможете!
пояснить не могу и не хочу, для этого включайте извилины.
Вот допустим элементарный пример с использованием стандартного контента:
Код: php
<?php
$db =& JFactory::getDBO();
$lim   = 4; //Кол-во на одной странице
$lim0  = JRequest::getVar('limitstart', 0, '', 'int');
$db->setQuery('SELECT title FROM #__content',$lim0, $lim);
$rL=&$db->loadObjectList();
if (empty($rL)) {$jAp->enqueueMessage($db->getErrorMsg(),'error'); return;} 
else {
////Here the beauty starts
$db->setQuery('SELECT COUNT(id) FROM #__content');  //no reloading the query! Just asking for total without limit
jimport('joomla.html.pagination');
$pageNav = new JPagination( $db->loadResult(), $lim0, $lim);

foreach($rL as $r) {
echo $r->title;
}
echo $pageNav->getPagesLinks(  ); //Displays PagesLinks
} ?>
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Пагинация для компонента.
« Ответ #5 : 22.09.2010, 12:47:44 »
Код: php
"$option.limit"
^-^
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Re: Пагинация для компонента.
« Ответ #6 : 22.09.2010, 14:12:48 »
Но у меня похожий пример и мой и ваш показывает
Код
«Первая Предыдущая 1 2 3 4 5 6 7 8 9 10 Следующая Последняя»
только проблема вот в чем страниц при этом может быть одна, а когда переходишь на все остальные выдает ошибку
Код
Fatal error: Call to a member function enqueueMessage() on a non-object in Z:\home\com.ru\www\components\com_hello\views\hello\tmpl\view_cat.php on line 72
якобы не чего выводить! Поэтому и прошу помочь в этом, может что то обнулить надо. если кто знает подскажите!
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Re: Пагинация для компонента.
« Ответ #7 : 22.09.2010, 14:23:14 »
Вопрос снят!! Спасибо за пример SmokerMan. +1
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Re: Пагинация для компонента.
« Ответ #8 : 30.09.2010, 10:49:20 »
У меня теперь появился еще один вопрос как сделать так чтобы элемента списка были пронумерованы <ol> и при переходе нумерация продолжалась а не начиналась заново!
*

ybiza

  • Захожу иногда
  • 68
  • 4 / 0
Re: Пагинация для компонента.
« Ответ #9 : 04.10.2010, 17:51:53 »
Вопрос в следующем.  Вставляю вот этот код
Код
<?php
$db =& JFactory::getDBO();
$lim   = 4; //Кол-во на одной странице
$lim0  = JRequest::getVar('limitstart', 0, '', 'int');
$db->setQuery('SELECT title FROM #__content',$lim0, $lim);
$rL=&$db->loadObjectList();
if (empty($rL)) {$jAp->enqueueMessage($db->getErrorMsg(),'error'); return;} 
else {
////Here the beauty starts
$db->setQuery('SELECT COUNT(id) FROM #__content');  //no reloading the query! Just asking for total without limit
jimport('joomla.html.pagination');
$pageNav = new JPagination( $db->loadResult(), $lim0, $lim);
 
foreach($rL as $r) {
    echo $r->title;
}
echo $pageNav->getPagesLinks(  ); //Displays PagesLinks
} ?>
 
на сайте работает все хорошо а в админке не хочет работать на пагинация показывается а переход на страницы не осуществляется ссылка имеет вид # что может быть. И еще если вписываешь limitstart=2 то загружается следующая страница. Подскажите пожалуйста?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

При попытке войти в админку 404 ошибка компонента

Автор omezik

Ответов: 4
Просмотров: 2899
Последний ответ 31.08.2019, 22:41:46
от Taatshi
Пагинация с разбивкой троеточием

Автор sashgera

Ответов: 0
Просмотров: 2028
Последний ответ 17.07.2015, 23:07:04
от sashgera
Вывод компонента в качестве модуля

Автор fMichail

Ответов: 4
Просмотров: 3473
Последний ответ 06.08.2014, 15:16:29
от anar4ik
Информация по написанию компонента

Автор konstantinopol

Ответов: 410
Просмотров: 112727
Последний ответ 09.04.2014, 10:35:47
от khrapsha
Переменные, доступные из любого компонента

Автор Serjo_man

Ответов: 3
Просмотров: 1970
Последний ответ 03.02.2014, 05:22:00
от Arkadiy