Новости 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 Гость просматривают эту тему.
  • 11 Ответов
  • 3554 Просмотров
*

alxcube

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
JFactory::getUser($id); fatal error
« : 01.08.2013, 04:14:33 »
Всем привет! Такая штука: пробую в админке использовать JFactory::getUser($id) -- и вылетает fatal error. Собственно, дело даже не в этом. Пробовал JUser::getInatsnce($id) -- то же самое. Пробовал даже $user = JTable::getInstance('User', 'Jtable'); $user->load($id); -- все равно fatal error. Потому что Jtable::getInstance не возвращает объект таблицы. Ошибка вылетает при попытке того самого load(). Просто не возвращает getInstance нужную таблицу. И не могу понять в чем дело. Возможно, кто-то сталкивался? Буду благодарен за помощь. Я-то через запросы к базе получаю то, что нужно, но неприятно, что так деревянно все получается)
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: JFactory::getUser($id); fatal error
« Ответ #1 : 01.08.2013, 09:19:29 »
Всем привет! Такая штука: пробую в админке использовать JFactory::getUser($id) -- и вылетает fatal error. Собственно, дело даже не в этом. Пробовал JUser::getInatsnce($id) -- то же самое. Пробовал даже $user = JTable::getInstance('User', 'Jtable'); $user->load($id); -- все равно fatal error. Потому что Jtable::getInstance не возвращает объект таблицы. Ошибка вылетает при попытке того самого load(). Просто не возвращает getInstance нужную таблицу. И не могу понять в чем дело. Возможно, кто-то сталкивался? Буду благодарен за помощь. Я-то через запросы к базе получаю то, что нужно, но неприятно, что так деревянно все получается)
Для начала посоветую прочитать вот это и скопирастить код для проверки.
Проверьте что у Вас содержится в переменной $id.

И вообще, что за ошибка. В студию весь текст ошибки. Покажите код в котором вызываете. И т.п.
*

alxcube

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: JFactory::getUser($id); fatal error
« Ответ #2 : 01.08.2013, 11:39:44 »
Для начала посоветую прочитать вот это и скопирастить код для проверки.
Проверьте что у Вас содержится в переменной $id.

И вообще, что за ошибка. В студию весь текст ошибки. Покажите код в котором вызываете. И т.п.

Та с jdatabase я хорошо знаком )

ошибка такая: Fatal error: Call to a member function load() on a non-object in .../libraries/joomla/user/user.php on line 887

$id я просто привел в пример. вообще, вызываю в модели таким путем:

Код
$user = JFactory::getUser($payment->user_id); 
$payment -- объект класса, наследующего JTable;
Код
$payment->user_id;
это целочисельное свойство. суть не во всем этом. я и указывал тип при передаче, и просто вбивал вручную id существующего пользователя... просто говорю: jtable::getinstance('user','JTable') не возвращает объект
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Re: JFactory::getUser($id); fatal error
« Ответ #3 : 01.08.2013, 14:06:23 »
Может у тебя с таблицей что-то не так: или поле переименовано или сама таблица или префикс.
*

alxcube

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: JFactory::getUser($id); fatal error
« Ответ #4 : 01.08.2013, 15:54:01 »
Может у тебя с таблицей что-то не так: или поле переименовано или сама таблица или префикс.
да не, таблица стандартная #__users же. да и без агрументов возвращает нормально текущего пользователя
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: JFactory::getUser($id); fatal error
« Ответ #5 : 01.08.2013, 15:57:45 »
Ну дык var_dump($payment) и смотрим, инициализируется ли user_id и вообще что происходит с этим объектом.
*

alxcube

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: JFactory::getUser($id); fatal error
« Ответ #6 : 01.08.2013, 19:33:27 »
Ну дык var_dump($payment) и смотрим, инициализируется ли user_id и вообще что происходит с этим объектом.
инициализируется. с ней все нормально. я ж говорю, что пробовал просто вручную вводить id существующего пользователя -- все то же самое.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: JFactory::getUser($id); fatal error
« Ответ #7 : 01.08.2013, 20:08:13 »
Хм, а почему бы не посмотреть на все это безобразие в отладке?
*

alxcube

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: JFactory::getUser($id); fatal error
« Ответ #8 : 02.08.2013, 16:09:23 »
Хм, а почему бы не посмотреть на все это безобразие в отладке?
А как отлаживать php, ктоме print_r ? ) буду благодарен за совет )
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Re: JFactory::getUser($id); fatal error
« Ответ #9 : 02.08.2013, 20:20:45 »
А как отлаживать php, ктоме print_r ? ) буду благодарен за совет )
В админке включить отображение ошибок + проврить наличие в шаблоне позиции debug (обычно под сайтом). Ну а вместо print_r мне лично удобнее юзать var_dump + Xdebug
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: JFactory::getUser($id); fatal error
« Ответ #10 : 02.08.2013, 21:45:04 »
где в админке это не работает. Опишите подробно, что вы делаете
*

alxcube

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: JFactory::getUser($id); fatal error
« Ответ #11 : 05.08.2013, 12:39:08 »
где в админке это не работает. Опишите подробно, что вы делаете
Это модель, наследует JModelAdmin. Выполняет проверки, записывает данные в базу через класс таблички, после чего отправляет пользователю на почту уведомление. И вот когда я пытаюсь получить пользователя по айдишнику, мне выбрасывает fatal error, как я уже выше писал: JTable::getInstance('User', 'JTable'); не возвращает инстанцию таблицы, и fatal error вылетает при попытке на этом объекте выполнить метод load()

В модели такой код:

Код
 public function save($data) {
            $payment = $this->getTable();
            $payment->load($data['payment_id'] ? $data['payment_id'] : JFactory::getApplication()->input->getInt('payment_id', 0));
            $old_state = $payment->state;
            
            if (!parent::save($data)) {
                return FALSE;
            };
            
            if ($data['state'] == 1 && $old_state == 0) {
                $this->_notifyUser($payment);
            }
            
            return TRUE;
            
        }
В _notifyUser я пытался получить пользователя через JFactory::getUser($payment->user_id), через JUser::getInstance($payment->user_id), но тщетно )

В итоге получаю пользователя так:

Код
$db = JFactory::getDbo();
            $query = "SELECT name, username, email, params FROM #__users WHERE id = " . $payment->user_id;
            $db->setQuery($query);
            $user = $db->loadObject();
            $params = new JRegistry();
            $params->loadString($user->params);
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Fatal error: Call to undefined method UsersModelLogin::store()

Автор jservice

Ответов: 37
Просмотров: 9752
Последний ответ 17.02.2015, 15:41:54
от kolio
Fatal error: Cannot redeclare showQuestions() (previously declared in

Автор sergvlask

Ответов: 2
Просмотров: 1946
Последний ответ 01.12.2013, 13:24:42
от sergvlask
AJAX запрос к функции контроллера и JFactory::getUser

Автор kathu

Ответов: 12
Просмотров: 3490
Последний ответ 10.09.2013, 23:27:24
от Fedor Vlasenko