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

leha111

  • Захожу иногда
  • 226
  • 0 / 0
При создании компонента создается база данных. Надо достать данные из неё и, пока что, абы как вывести на странице в админке.

Код
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
 
    <name>School Tech</name>
    <!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
    <creationDate></creationDate>
    <!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
    <author>Mu Compani</author>
    <authorUrl></authorUrl>
    <copyright></copyright>
    <license>0.0.1</license>
    <!-- Строка 'version' записывается в таблицу компонентов -->
    <version>0.0.8</version>
    <!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
    <description>
        Контент для сайта
    </description>
 
    <namespace path="src/">MuCompani\Component\SchoolTech</namespace>

<files folder="site/">
<folder>language</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>

<languages>
<language tag="en-GB">site/language/en-GB/en-GB.com_schooltech.ini</language>
<language tag="ru-RU">site/language/ru-RU/ru-RU.com_schooltech.ini</language>
</languages>
           
    <administration>
        <!-- Ссылка, которая появится в меню админки Joomla "Components" -->
        <menu>SchoolTech</menu>
<submenu>
<menu link="option=com_schooltech&amp;view=trainingprograms">COM_SCHOOLTECH_TRAINING_PROGRAMS</menu>
</submenu>

        <!-- Список файлов и папок для копирования.
             Обратите внимание на атрибут "folder".
             Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
        <files folder="admin/">
<folder>language</folder>
            <folder>services</folder>
<folder>sql</folder>
            <folder>src</folder>
            <folder>tmpl</folder>
        </files>

<languages>
            <language tag="en-GB">admin/language/en-GB/en-GB.com_schooltech.ini</language>
            <language tag="en-GB">admin/language/en-GB/en-GB.com_schooltech.sys.ini</language>
<language tag="ru-RU">admin/language/ru-RU/ru-RU.com_schooltech.ini</language>
            <language tag="ru-RU">admin/language/ru-RU/ru-RU.com_schooltech.sys.ini</language>
        </languages>
    </administration>

<install>
        <sql>
            <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
        </sql>
    </install>
    <uninstall>
        <sql>
            <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
        </sql>
    </uninstall>
<update>
        <schemas>
            <schemapath type="mysql">sql/mysql</schemapath>
        </schemas>
    </update>
 
</extension>

sql/install.mysql.utf8.sql

Код
CREATE TABLE `#__schooltech_training_programs` ( 
    `id` SERIAL NOT NULL,
    `name` VARCHAR(200) NOT NULL,
    `published` BOOLEAN NOT NULL DEFAULT FALSE,
`description` MEDIUMTEXT,
`education_time` INT,
`document` MEDIUMTEXT,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

INSERT INTO `#__schooltech_training_programs` (`name`) VALUES
    ('TEST1'),
    ('TEST2');

src/View/Trainingprograms/HtmlView.php
Код
namespace MuCompani\Component\SchoolTech\Administrator\View\Trainingprograms;

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * [member=126442]copyright[/member]   Copyright (C) 2021 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */

/**
 * Основной вид в админке "SchoolTech"
 */
class HtmlView extends BaseHtmlView {

//Массив значений для вывода учебных программ
protected $items;
    /**
     * Отображение основного вида "SchoolTech"
     *
     * @param   string  $tpl  Имя файла шаблона для анализа; автоматический поиск путей к шаблону.
     * @return  void
     */
    function display($tpl = null) {

$this->items= $this->get('Items');//Объекты для отображения
var_dump($this->items);

        parent::display($tpl);
    }


}

src/Model/TrainingprogramsModel.php
Код
namespace MuCompani\Component\SchoolTech\Administrator\Model;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Utilities\ArrayHelper;

class ContactsModel extends ListModel
{
protected function getListQuery(){

//Создаем новый query объект
$db = $this->getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();

//Выберем необходимые поля из таблицы
$query->select(
$db->quoteName(
explode(
', ',
$this->getState(
'list.select',
'a.id, a.name, a.alias'
)
)
)
);

$query->from($db->quoteName('#__schooltech_training_programs', 'a'));
return $query;
}
}

tmpl/trainingprograms/default.php
Код
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;

HTMLHelper::_('behavior.multiselect');

$user      = Factory::getUser();//Информация о текущем пользователе
$userId    = $user->get('id');



// Нет прямого доступа к этому файлу
defined('_JEXEC') or die('Всем кыш! =D');
?>
<h2>Здесь будут программы обучения</h2>

Выдает null. Что ещё надо сделать, чтобы компонент получил доступ к этим записям в БД ?
*

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
У Вас нет столбца alias
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Переделал

sql/install.mysql.utf8.sql
Код
CREATE TABLE `#__schooltech_training_programs` ( 
    `id` SERIAL NOT NULL,
    `name` VARCHAR(200) NOT NULL,
    `published` BOOLEAN NOT NULL DEFAULT FALSE,
`alias` MEDIUMTEXT,
`description` MEDIUMTEXT,
`education_time` INT,
`document` MEDIUMTEXT,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

src/Model/TrainingprogramsModel.php
Код
<?php
namespace MuCompani\Component\SchoolTech\Administrator\Model;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Utilities\ArrayHelper;

class ContactsModel extends ListModel
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'id', 'a.id',
'name', 'a.name',
'alias', 'a.alias',
);

if (Associations::isEnabled())
{
$config['filter_fields'][] = 'association';
}
}

parent::__construct($config);
}
   
protected function populateState($ordering = 'a.name', $direction = 'asc')
{
$app = Factory::getApplication();

$forcedLanguage = $app->input->get('forcedLanguage', '', 'cmd');

// Adjust the context to support modal layouts.
if ($layout = $app->input->get('layout'))
{
$this->context .= '.' . $layout;
}

// Adjust the context to support forced languages.
if ($forcedLanguage)
{
$this->context .= '.' . $forcedLanguage;
}

// List state information.
parent::populateState($ordering, $direction);

// Force a language.
if (!empty($forcedLanguage))
{
$this->setState('filter.language', $forcedLanguage);
}
}

protected function getStoreId($id = '')
{
// Compile the store id.
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.published');
$id .= ':' . serialize($this->getState('filter.category_id'));
$id .= ':' . $this->getState('filter.access');
$id .= ':' . $this->getState('filter.language');
$id .= ':' . serialize($this->getState('filter.tag'));
$id .= ':' . $this->getState('filter.level');

return parent::getStoreId($id);
}

protected function getListQuery()
{
//Создаем новый query объект
$db = $this->getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();

//Выберем необходимые поля из таблицы
$query->select(
$db->quoteName(
explode(
', ',
$this->getState(
'list.select',
'a.id, a.name, a.alias'
)
)
)
);

$query->from($db->quoteName('#__schooltech_training_programs', 'a'));


return $query;
}
}
?>

Все равно null. Может, с контроллерами проблема ?

src/Controller/TrainingprogramsController.php
Код
namespace MuCompani\Component\SchoolTech\Administrator\Controller;

\defined('_JEXEC') or die;

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\AdminController;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\Input\Input;
use Joomla\Utilities\ArrayHelper;

public function featured()
{
// Check for request forgeries
$this->checkToken();

$ids    = $this->input->get('cid', array(), 'array');
$values = array('featured' => 1, 'unfeatured' => 0);
$task   = $this->getTask();
$value  = ArrayHelper::getValue($values, $task, 0, 'int');

// Get the model.
/** @var \Joomla\Component\Contact\Administrator\Model\ContactModel $model */
$model  = $this->getModel();
}


public function getModel($name = 'SchoolTech', $prefix = 'Administrator', $config = array('ignore_request' => true))
{
return parent::getModel($name, $prefix, $config);
}

Или я какой-то важный файл пропустил ? Знает кто, откуда $this->items= $this->get('Items'); берется ?
« Последнее редактирование: 14.02.2022, 08:49:33 от leha111 »
*

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Знает кто, откуда $this->items= $this->get('Items'); берется ?
вот от сюда https://github.com/joomla/joomla-cms/blob/4.1-dev/libraries/src/MVC/View/AbstractView.php#L131

Все равно null. Может, с контроллерами проблема ?
Проверьте существование модели в файле представления (tmpl/trainingprograms/default.php)
Код: php
$model = $this->getModel();
echo get_class($model). '<br>';
2 вариант! В файле (src/Model/TrainingprogramsModel.php)
выведите SQL запрос в выполните его напрямую в phpMyAdmin

Код: php
echo $query . '<hr>';
return $query;
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Цитировать
Проверьте существование модели в файле представления (tmpl/trainingprograms/default.php)
Код: php
Код
$model = $this->getModel();
echo get_class($model). '<br>';

Проблема в том. что в компоненте com_contact, с которым я сверяюсь,

Код
$this->items         = $this->get('Items');
var_dump($this->get('Items'));

в /src/View/Contacts/HtmlView.php без этого нормально работает (по крайнее мерее, я там такого представления не нащел). И суть не в том, чтобы просто вывести надпись. Факт её выведения является доказательством того, что нормально получен доступ к базе данных.
*

sivers

  • Живу я здесь
  • 2596
  • 360 / 0
$this->items         = $this->get('Items');
эта строка в представлении вызывает метод getItems модуля (!), который, в свою очередь, вызывает метод (в модуле же) getListQuery(), в котором собственно и формируется запрос к БД (метод должен вернуть сформированную строку запроса БД). Вот в getListQuery вы и должны учесть все переданные параметры и сформировать запрос (только сформировать, саму выборку не делать).
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Собственно, у меня ест файл
src/Model/TrainingprogramsModel.php

А в нем
Код
namespace MuCompani\Component\SchoolTech\Administrator\Model;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Utilities\ArrayHelper;

class ContactsModel extends ListModel
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'id', 'a.id',
'name', 'a.name',
'alias', 'a.alias',
);

if (Associations::isEnabled())
{
$config['filter_fields'][] = 'association';
}
}

parent::__construct($config);
}
   
protected function populateState($ordering = 'a.name', $direction = 'asc')
{
$app = Factory::getApplication();

$forcedLanguage = $app->input->get('forcedLanguage', '', 'cmd');

// Adjust the context to support modal layouts.
if ($layout = $app->input->get('layout'))
{
$this->context .= '.' . $layout;
}

// Adjust the context to support forced languages.
if ($forcedLanguage)
{
$this->context .= '.' . $forcedLanguage;
}

// List state information.
parent::populateState($ordering, $direction);

// Force a language.
if (!empty($forcedLanguage))
{
$this->setState('filter.language', $forcedLanguage);
}
}

protected function getStoreId($id = '')
{
// Compile the store id.
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.published');
$id .= ':' . serialize($this->getState('filter.category_id'));
$id .= ':' . $this->getState('filter.access');
$id .= ':' . $this->getState('filter.language');
$id .= ':' . serialize($this->getState('filter.tag'));
$id .= ':' . $this->getState('filter.level');

return parent::getStoreId($id);
}

protected function getListQuery()
{
//Создаем новый query объект
$db = $this->getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();

//Выберем необходимые поля из таблицы
$query->select(
$db->quoteName(
explode(
', ',
$this->getState(
'list.select',
'a.id, a.name, a.alias'
)
)
)
);

$query->from($db->quoteName('#__schooltech_training_programs', 'a'));


return $query;
}
}

Собственно, что с ним не так ? Или надо что-то ещё ? Или с вышеописанным src/Controller/TrainingprogramsController.php ?
« Последнее редактирование: 18.02.2022, 08:48:20 от leha111 »
*

sivers

  • Живу я здесь
  • 2596
  • 360 / 0
Собственно, что с ним не так ? Или надо что-то ещё ?
Делайте вывод логов, чтоб разобраться. Поставьте перед return $query; строчку echo $query->dump(); exit; - увидите какой запрос формируется (если ничего не увидите - значит метод не отрабатывает). Попробуйте полученный запрос выполнить вручную в пхпМуАдмин - посмотрите возвращает ли он что-нибудь. А там дальше - по результатам.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Судя по реакции, метод вообще не отрабатывается. Я как-то неправильно название файла прописал или надо его как-то в контроллерах указать ?
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Проблема оказалась в том, что я, не подумав что это важно, тупо передрал название класса ContactsModel, вместо того, чтобы переименовать в TrainingprogramsModel
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как сохранить в файле txt информацию из поля input?

Автор GuDeVic

Ответов: 1
Просмотров: 882
Последний ответ 20.11.2023, 14:34:09
от GuDeVic
Скрыть информацию на гостевой странице

Автор Andrew_Shi

Ответов: 10
Просмотров: 1436
Последний ответ 05.11.2023, 20:32:33
от Andrew_Shi
Есть ли способ уменьшить вес таблиц в БД у компонента Finder?

Автор denxio

Ответов: 1
Просмотров: 513
Последний ответ 15.10.2023, 12:27:02
от Andrew_Shi
Фильтр type=&quot;sql&quot; для компонента J! 4

Автор GuDeVic

Ответов: 0
Просмотров: 456
Последний ответ 11.08.2022, 13:14:21
от GuDeVic
Проблема вывода компонента на Front-end

Автор GuDeVic

Ответов: 23
Просмотров: 3108
Последний ответ 09.08.2022, 16:09:21
от GuDeVic