Новости Joomla

Joomla 6: Автоматические обновления ядра в Joomla

Joomla 6: Автоматические обновления ядра в Joomla

👩‍💻 Joomla 6: Автоматические обновления ядра в Joomla. В октябрьском номере официального журнала Joomla - Joomla Community Magazine вышла статья David Jardin, где рассказывается о внедрении функционала автоматического обновления ядра Joomla.❓Почему сейчас? Joomla же жила как-то 20 лет без автоматических обновлений?Это оказалась самая востребованная за последнее время от пользователей Joomla функция. Но, основная причина внедрения - проблемы безопасности. Всякий раз, когда в новой версии Joomla устраняется уязвимость, злоумышленники начинают анализировать код, чтобы выяснить, какая именно уязвимость была исправлена. И как только они это выясняют - начинается разработка автоматизированных скриптов для взлома как можно большего количества сайтов. Затем доступы к автоматически взломанным сайтам продаются в профильных чатах и ресурсах "пачками" по несколько сотен тысяч или миллионов сайтов. Ваш сайт могли взломать несколько лет назад, но воспользоваться уязвимостью могут не сразу, а тогда, когда у злоумышленников возникнет необходимость. И только после этого вы может быть узнаете об этом.Анализ патча, понимание проблемы и разработка скрипта требуют времени. И если владелец сайта не обновит его до истечения этого срока, сайт может быть взломан. А хакеры действуют быстро! Для критических, легко эксплуатируемых уязвимостей речь идёт о временном окне в 10–12 часов — и этого времени явно недостаточно, чтобы все успели обновить свои сайты.Здесь выходят на первый план автоматизированные обновления: проект Joomla теперь может активно устанавливать обновления (и, следовательно, исправления безопасности) на сайты, чтобы гарантировать, что сайты действительно обновляются вовремя.🕘 От первых идей до реализации прошло 5 лет. И здесь можно вспомнить, как в Joomla 5.1 внедрили TUF - The Update Framework, позволяющий устанавливать защищённое соединение между сайтом и сервером обновлений и исключает возможность supply chain attack (атаки на цепочку поставок).Об особенностях реализации и требованиях к сайту читаем подробнее в статье на JCM.@joomlafeed#joomla #secutiry #jcm

Первый выпуск журнала NorrNext в честь 20-й годовщины Joomla™

Первый выпуск журнала NorrNext в честь 20-й годовщины Joomla™

Первый выпуск журнала NorrNext в честь 20-й годовщины Joomla™. Интервью с волонтёрами 🎈Ну что, друзья, вот и настал этот долгожданный момент. Мы выпустили первое издание собственного журнала под эгидой NorrNext, который включает в себя интервью с видными деятелями сообщества из разных стран и континентов.Общий нарратив: показать, что нас объединяет (Joomla) и узнать больше о людях, которые вносят свой вклад в развитие платформы в своих сообществах. 20 лет — это много. Давайте же узнаем о коллегах 🎁 Первый цикл включает такие страны, как Австрия, Испания, Латвия, Россия, Румыния, Тайланд, Черногория, Чехия.⚙️ С кем интервью: ✔️ Владимир Елисеев 🇷🇺✔️ Дмитрий Рекун 🇱🇻✔️ Дмитрий Цымбал 🇷🇺✔️ Евгений Сивоконь 🇷🇺 ✔️ Сергей Толкачёв 🇷🇺✔️ Dénes Székely 🇷🇴✔️ Jan Pavelka 🇨🇿✔️ Miljan Vujosevic 🇲🇪✔️ Sergio Iglesias 🇪🇸✔️ Sigrid Gramlinger 🇦🇹✔️ Pisan Chueatchatchai 🇹🇭‼️ Новые интервью будут добавляться до конца декабря 2025. Заходите по ссылке время от времени💡👉 Читать далее

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

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Подскажите пожалуйста, как в Joomle 1.5 сделать следующее:

к примеру есть работа с БД вида:

Код: php
$db =& JFactory::getDBO();
$query = 'SELECT greeting FROM #__hello';
$db->setQuery( $query );
$greeting = $db->loadResult();

можно ли как-то установить hook на функции получения результатов SQL-запросов, чтобы к примеру их кэшировать. Т.е. чтобы строки:

Код: php
$query = 'SELECT greeting FROM #__hello';
$db->setQuery( $query );
$greeting = $db->loadResult();

не делали запрос к БД, а чтобы я в своей функции возвращал результаты этого запроса из кэша.

Меня интересует именно механизм, о подробностях кэширования не спрашиваю :)

Заранее благодарен всем за ответы :)


*

era

  • Администратор
  • 1588
  • 392 / 5
  • В туалете лучше быть пользователем, чем админом.
Re: Установить hook на запросы к БД
« Ответ #1 : 02.09.2009, 12:52:06 »
если надо в своём компоненте это сделать, то можешь создать класс, в который будешь передавать запрос, а там уже проверять кеш, если не кешировано, то уже внутри класса обращаться к стандартному классу БД
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #2 : 02.09.2009, 12:53:08 »
если надо в своём компоненте это сделать, то можешь создать класс, в который будешь передавать запрос, а там уже проверять кеш, если не кешировано, то уже внутри класса обращаться к стандартному классу БД
как передавть все запросы в мой компонент (вернее уже наверное разумнее сказать не компонент  - ибо это задача плагина)?

зарегистрировать событие на все запросы к БД в Joomle ??
через $mainframe->triggerEvent() - но я такого события на docs.joomla.org не нашел
*

era

  • Администратор
  • 1588
  • 392 / 5
  • В туалете лучше быть пользователем, чем админом.
Re: Установить hook на запросы к БД
« Ответ #3 : 02.09.2009, 13:16:59 »
посмотри компонент JoomFish - он подменяет класс работы с БД (в Joomla 1.0, дял Joomla 1.5 не смотрел) своим классом, там разбирает запрос и создаёт возможность работы с несколькими языками сайта.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Установить hook на запросы к БД
« Ответ #4 : 02.09.2009, 13:43:51 »
Да, вы можете сделать класс-прокси, примерно вот по такой схеме:

Код: php
$oldDB =& JFactory::getDBO();
$newDB =& new ProxyDB($oldDB);
$oldDB = $newDB;

Класс ProxyDB объявить наследником от JDatabase, и в переопределенном конструкторе, проинициализировать текущий экземпляр данными из переданного объекта, переопределить методы query, loadResult, loadObjectList и т.д., в которых проверять сначала на наличие кэшированных данных, и если их нет, вызывать методы оригинального объекта.

Указанную подмену текущего объекта работы с базой нужно делать естественно в системном плагине, до того, как компоненты и другие плагины полезут в БД, иначе вы не все запросы перехватите. В принципе, действительно, посмотрите JoomFish, они подобный трюк вполняют.
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #5 : 02.09.2009, 15:05:57 »
В принципе, действительно, посмотрите JoomFish, они подобный трюк вполняют.

Открыл внутренности плагина jfdatabase (JoomFish) чуть голову не сломал...
Уважаемый  smart, вы не могли бы немножно набросать php-кода класса ProxyDB.. )))
Я дико извиняюсь за то что прошу это :) просто не могу разобратся почему то во всем этом :( Был бы очень благодарен вам
« Последнее редактирование: 02.09.2009, 15:16:01 от enshtein »
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Установить hook на запросы к БД
« Ответ #6 : 02.09.2009, 15:34:48 »
А что там набрасывать-то? Он точно такой же как JDatabase, за тем исключением, что в нем должны быть переопределены методы, возвращающие данные, и внутри этих методов сначала посмотреть, а нет ли данных для текущего запроса в кэше, и только если их там нет, вызвать метод родительского класса (либо сохраненного в переменной оригинального объекта DBO). В общем набрасывать тут нечего...
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #7 : 02.09.2009, 15:38:28 »
Обьясню зачем я песню эту затеял :)
Вообщем то все известные мне cache-компоненты и плагины для Joomle да и не только - работают по системе Cache Life Time - т.е. закэшировали результаты запроса к БД или части (целиком) страницу на время жизни кэша (как раз таки Life Time) и выдают кэш, как Life Time кончилось перекэшируют вывод и по кругу ...  для статичных сайтов ну и т.д. - такая схема подходит.. но бывают случаи когда такой алгоритм работы кэша не устраивает (высокодинамичные сайты и т.д.)

Что я думаю сделать - написать плагин для Joomlа реализующий систему Cache Events - т.е. событийное кэширование. К примеру свежеустановленная Joomla 1.5.х делает порядка 20 запросов к БД (Главная страница). Я думаю сократить количество запросов до 1-2х. Алгоритм следующий:
1) Если происходит SQL-запрос вида SELECT - полученный результат запроса кэшируется и при следующем выполнении этого же запроса результат вернется из кэша
2) Если происходит SQL-запрос вида UPDATE, INSERT, DELETE и др. изменяющие данные в таблице - то прежний кэш результат SQL-запроса удаляется. В следствии чего последующий SQL-запрос вида SELECT (пункт 1) переобновит кэш запроса и вернет результат из таблицы.

Хранить кэши SQL-запросов можно в MySQL таблице ну или в файле (имя файла как md5 строки SQL-запроса типа SELECT тут уж как фантазия развита);

вот собственно это все заставило меня задуматся над темой написания такого плагина - думаю он многим бы пригодился. Тем более он лишен недостатка почти всех систем кэширование - это возврат устаревшего кэша.

Незнаю может я конечно тут велосипед придумываю :) Если кто видел что-то подобное подскажите :)
*

Darkick

  • Завсегдатай
  • 1142
  • 239 / 1
Re: Установить hook на запросы к БД
« Ответ #8 : 02.09.2009, 15:45:19 »
БД сама в какой-то степени кэширует выдачу, так что можно частично расчитывать на неё.
Но если сам разработаешь хорошую ускорялку - плюс тебе. Только как ты собираешься её делать, если просишь накидать тебе код класса-прокси?
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #9 : 02.09.2009, 15:49:41 »
Только как ты собираешься её делать, если просишь накидать тебе код класса-прокси?

да все это я могу.. и разобратся и теорию ООП открыть почитать ))) лень матушка... и время цыгель цыгель...
потому и обратился за помощью )) иногда человек может сократить массу времени не сильно углубляясь и разбираясь в чем-то... главное задачу решить :) я сам не люблю когда просят что-то помочь в таком плане)) но все же )) 
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Установить hook на запросы к БД
« Ответ #10 : 02.09.2009, 15:51:34 »
Затея правильная, я уверен, что такое расширение будет очень популярно, и действительно полезно.

БД сама в какой-то степени кэширует выдачу, так что можно частично расчитывать на неё.
Ну описанная схема способна существенно снизить нагрузку на БД, так что мысль здравая... давным давно [в далекой далекой галактике|Mambo](нужное подчеркнуть) я делал подобное для одного проекта, но не на уровне плагина (ибо такого рода плагины там отсутствовали). Если повезет, я попробую найти где-нибудь в архивах куски данной модификации, хотя слабо в это верю - я редко храню такие старые штуковины.
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #11 : 02.09.2009, 16:03:46 »
ладно.. писать за меня это жирно - понимаю ))) впринципе не прошу ))
тогда скажите что я не так делаю ) так проще наверное будет :

к примеру вот содержимое системного плагина, в котором я хочу переопределить метод setQuery таким образом чтобы он мне выводил SQL запросы.

Код: php
defined( '_JEXEC' ) or die( 'Restricted access' ); 

class ProxyDB extends JDatabase {
    function __construct( ) {
        $conf =& JFactory::getConfig();
        $host         = $conf->getValue('config.host');
        $user         = $conf->getValue('config.user');
        $password     = $conf->getValue('config.password');
        $db           = $conf->getValue('config.db');
        $dbprefix     = $conf->getValue('config.dbprefix');
        $dbtype     = $conf->getValue('config.dbtype');
        $debug         = $conf->getValue('config.debug');
        $driver     = $conf->getValue('config.dbtype');
        $options = array("driver"=>$driver, "host"=>$host, "user"=>$user, "password"=>$password, "database"=>$db, "prefix"=>$dbprefix,"select"=>true);
        parent::__construct( $options );
    }
   
    function setQuery( $sql, $offset = 0, $limit = 0, $prefix='#__' )
    {
        parent::setQuery( $sql, $offset = 0, $limit = 0, $prefix='#__'  );
    }
}

class plgSystemTCache extends JPlugin {
   
    function plgSystemTCache(& $subject, $config)
    {
        parent::__construct($subject, $config);
    }
   
    function onAfterInitialise()
    {
        $db = & JFactory::getDBO();
        $db = new ProxyDB();
        $GLOBALS['database'] = $db;
    }
}
« Последнее редактирование: 02.09.2009, 16:21:56 от enshtein »
*

Darkick

  • Завсегдатай
  • 1142
  • 239 / 1
Re: Установить hook на запросы к БД
« Ответ #12 : 02.09.2009, 16:42:21 »
Да, интересная задача. Надо будет на дома спокойно посмотреть, подумать.
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #13 : 02.09.2009, 23:11:19 »
Пролазив в доль и поперек JoomFish все-таки удалось найти решение :) вот пример:
Код: php
<?php

defined( '_JEXEC' ) or die( 'Restricted access' );

if($mainframe->isAdmin()) {
    return;
}

class interceptDB extends JDatabaseMySQL {

    /**
     * This special constructor reuses the existing resource from the existing db connecton
     *
     * @param unknown_type $options
     */
    function __construct($options){
        $db = & JFactory::getDBO();

        $select        = array_key_exists('select', $options)    ? $options['select']    : true;
        $database    = array_key_exists('database',$options)    ? $options['database']    : '';

        // perform a number of fatality checks, then return gracefully
        if (!function_exists( 'mysql_connect' )) {
            $this->_errorNum = 1;
            $this->_errorMsg = 'The MySQL adapter "mysql" is not available.';
            return;
        }

        // connect to the server
        $this->_resource = & $db->_resource;

        // finalize initialization
        JDatabase::__construct($options);

        // select the database
        if ( $select ) {
            $this->select($database);
        }

    }
   
}


class JFDatabase extends interceptDB {

    /** Constructor
    */
    function JFDatabase( $options) {
        parent::__construct($options );
    }
   
    function setQuery( $sql, $offset = 0, $limit = 0, $prefix='#__' )
    {
        parent::setQuery( $sql, $offset = 0, $limit = 0, $prefix='#__' );
    }

    /**
     * Returns a reference to the global Database object, only creating it
     * if it doesn't already exist. And keeps sure that there is only one
     * instace for a specific combination of the JDatabase signature
     *
     * @param string  Database driver
     * @param string Database host
     * @param string Database user name
     * @param string Database user password
     * @param string Database name
     * @param string Common prefix for all tables
     * @return database A database object
     * @since 1.5
    */
    function &getInstance( $driver='mysql', $host='localhost', $user, $pass, $db='', $table_prefix='' )
    {
        $signature = serialize(array($driver, $host, $user, $pass, $db, $table_prefix));
        $database = JDatabase::_getStaticInstance($signature,'JFDatabase',true);
        return $database;
    }


    /**
     * The following methods are not yet implemented in JoomFish (or may not be possible)
     */
    // function queryBatch( $abort_on_error=true, $p_transaction_safe = false)
}
   
 
class plgSystemTCache extends JPlugin {
 
    function plgSystemTCache(& $subject, $config)
    {
        parent::__construct($subject, $config);
    }
 
    function onAfterInitialise()
    {
        $conf =& JFactory::getConfig();
        $host         = $conf->getValue('config.host');
        $user         = $conf->getValue('config.user');
        $password     = $conf->getValue('config.password');
        $db           = $conf->getValue('config.db');
        $dbprefix     = $conf->getValue('config.dbprefix');
        $dbtype     = $conf->getValue('config.dbtype');
        $debug         = $conf->getValue('config.debug');
        $driver     = $conf->getValue('config.dbtype');

        $options = array("driver"=>$driver, "host"=>$host, "user"=>$user, "password"=>$password, "database"=>$db, "prefix"=>$dbprefix,"select"=>true);

        $db = & JFactory::getDBO();
        $db = new JFDatabase($options);
        $debug = $conf->getValue('config.debug');
        $db->debug($debug);

        if ($db->getErrorNum() > 2) {
            JError::raiseError('joomla.library:'.$db->getErrorNum(), 'JDatabase::getInstance: Could not connect to database <br/>' . $db->getErrorMsg() );
        }
    }
}
?>

спасибо всем кто подсказывал копать в сторону JoomFish ))
как напишу плагин обнародую )
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Установить hook на запросы к БД
« Ответ #14 : 03.09.2009, 02:16:13 »
пагадите.
может я чего-то не понимаю, но это работать не будет.
как вы собираетесь переопределять проксированием синглтон JFactory::getDBO, если обращение к плагинам происходит ПОСЛЕ инициализации JDatabase (просто вернет вам существующий instance и все)?
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

Darkick

  • Завсегдатай
  • 1142
  • 239 / 1
Re: Установить hook на запросы к БД
« Ответ #15 : 03.09.2009, 08:17:26 »
Тот "инстанс" будет подменён на новый. Правда уже выполненные запросы из лога пропадут (если их самостоятельно не переписать).
*

Physicist

  • Глобальный модератор
  • 984
  • 194 / 0
  • Рябов Денис
Re: Установить hook на запросы к БД
« Ответ #16 : 03.09.2009, 08:55:21 »
А Вы не хотите использовать компонент Query Cache, который именно по этой схеме и работает?
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Установить hook на запросы к БД
« Ответ #17 : 03.09.2009, 09:53:05 »
Хех, я так и думал, что уже есть готовое... вот так всегда, на самом интересном месте...
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #18 : 03.09.2009, 12:56:48 »
Хех, я так и думал, что уже есть готовое... вот так всегда, на самом интересном месте...
нету! задача не снимается :) будем решать )

А Вы не хотите использовать компонент Query Cache, который именно по этой схеме и работает?
скачал компонент QueryCache 1.5.0 RC2 (for Joomla 1.5.x) на офф. сайте, установил , увидел в настройках среди прочих параметр:
Time To Live: 300
а это и есть время жизни кэша. Это типичная система вида Cache Life Time, я же хочу разработать плагин реализующий систему Cache Events описанную выше мной. Читать внимательнее надо :) проблему не решили )

пагадите.
может я чего-то не понимаю, но это работать не будет.
как вы собираетесь переопределять проксированием синглтон JFactory::getDBO, если обращение к плагинам происходит ПОСЛЕ инициализации JDatabase (просто вернет вам существующий instance и все)?

Вот сматрите - это содержимое лога MySQL запросов:
Код: sql
090903 13:14:09	     38 Connect     joomla@localhost on 
     38 Query       set names cp1251
     38 Query       SET NAMES 'utf8'
     38 Init DB     joomla
     38 Query       SET sql_mode = 'MYSQL40'
     38 Query       SELECT * FROM jos_session WHERE session_id = '5a2bfbaed29474f6dcbbe9e1b9aa2b48'
     38 Query       DELETE FROM jos_session WHERE ( time < '1251968349' )
     38 Query       SELECT * FROM jos_session WHERE session_id = '5a2bfbaed29474f6dcbbe9e1b9aa2b48'
     38 Query       UPDATE `jos_session` SET `time`='1251969249',`userid`='0',`usertype`='',`username`='',`gid`='0',`guest`='1',`client_id`='0',`data`='__default|a:8:{s:15:\"session.counter\";i:31;s:19:\"session.timer.start\";i:1251968538;s:18:\"session.timer.last\";i:1251969144;s:17:\"session.timer.now\";i:1251969159;s:22:\"session.client.browser\";s:47:\"Opera/9.64 (Windows NT 5.1; U; ru) Presto/2.1.1\";s:8:\"registry\";O:9:\"JRegistry\":3:{s:17:\"_defaultNameSpace\";s:7:\"session\";s:9:\"_registry\";a:1:{s:7:\"session\";a:1:{s:4:\"data\";O:8:\"stdClass\":0:{}}}s:7:\"_errors\";a:0:{}}s:4:\"user\";O:5:\"JUser\":19:{s:2:\"id\";i:0;s:4:\"name\";N;s:8:\"username\";N;s:5:\"email\";N;s:8:\"password\";N;s:14:\"password_clear\";s:0:\"\";s:8:\"usertype\";N;s:5:\"block\";N;s:9:\"sendEmail\";i:0;s:3:\"gid\";i:0;s:12:\"registerDate\";N;s:13:\"lastvisitDate\";N;s:10:\"activation\";N;s:6:\"params\";N;s:3:\"aid\";i:0;s:5:\"guest\";i:1;s:7:\"_params\";O:10:\"JParameter\":7:{s:4:\"_raw\";s:0:\"\";s:4:\"_xml\";N;s:9:\"_elements\";a:0:{}s:12:\"_elementPath\";a:1:{i:0;s:58:\"W:\\home\\joomla\\www\\libraries\\joomla\\html\\parameter\\element\";}s:17:\"_defaultNameSpace\";s:8:\"_default\";s:9:\"_registry\";a:1:{s:8:\"_default\";a:1:{s:4:\"data\";O:8:\"stdClass\":0:{}}}s:7:\"_errors\";a:0:{}}s:9:\"_errorMsg\";N;s:7:\"_errors\";a:0:{}}s:13:\"session.token\";s:32:\"a5f9b8f7865533bd0eaa640f062c911d\";}' WHERE session_id='5a2bfbaed29474f6dcbbe9e1b9aa2b48'
     38 Query       SELECT * FROM jos_components WHERE parent = 0
     38 Query       SELECT folder AS type, element AS name, params FROM jos_plugins WHERE published >= 1 AND access <= 0 ORDER BY ordering
     38 Query       SET NAMES 'utf8'
     38 Init DB     joomla
     38 Query       SET sql_mode = 'MYSQL40'
     38 Query       SELECT m.*, c.`option` as component FROM jos_menu AS m LEFT JOIN jos_components AS c ON m.componentid = c.id WHERE m.published = 1 ORDER BY m.sublevel, m.parent, m.ordering
     38 Query       SELECT template FROM jos_templates_menu WHERE client_id = 0 AND (menuid = 0 OR menuid = 1) ORDER BY menuid DESC
     38 Query       SELECT a.id, a.title, a.alias, a.title_alias, a.introtext, a.fulltext, a.sectionid, a.state, a.catid, a.created, a.created_by, a.created_by_alias, a.modified, a.modified_by, a.checked_out, a.checked_out_time, a.publish_up, a.publish_down, a.images, a.attribs, a.urls, a.metakey, a.metadesc, a.access, CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(':', a.id, a.alias) ELSE a.id END as slug, CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug, CHAR_LENGTH( a.`fulltext` ) AS readmore, u.name AS author, u.usertype, g.name AS groups, u.email as author_email, cc.title AS category, s.title AS section, s.ordering AS s_ordering, cc.ordering AS cc_ordering, a.ordering AS a_ordering, f.ordering AS f_ordering FROM jos_content AS a INNER JOIN jos_content_frontpage AS f ON f.content_id = a.id LEFT JOIN jos_categories AS cc ON cc.id = a.catid LEFT JOIN jos_sections AS s ON s.id = a.sectionid LEFT JOIN jos_users AS u ON u.id = a.created_by LEFT JOIN jos_groups AS g ON a.access = g.id WHERE 1 AND a.access <= 0 AND a.state = 1 AND (( cc.published = 1 AND s.published = 1 ) OR ( a.catid = 0 AND a.sectionid = 0 ) ) AND ( a.publish_up = '0000-00-00 00:00:00' OR a.publish_up <= '2009-09-03 09:14:09' ) AND ( a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2009-09-03 09:14:09' ) ORDER BY  f.ordering
     38 Query       SELECT a.id, a.title, a.alias, a.title_alias, a.introtext, a.fulltext, a.sectionid, a.state, a.catid, a.created, a.created_by, a.created_by_alias, a.modified, a.modified_by, a.checked_out, a.checked_out_time, a.publish_up, a.publish_down, a.images, a.attribs, a.urls, a.metakey, a.metadesc, a.access, CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(':', a.id, a.alias) ELSE a.id END as slug, CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug, CHAR_LENGTH( a.`fulltext` ) AS readmore, u.name AS author, u.usertype, g.name AS groups, u.email as author_email, cc.title AS category, s.title AS section, s.ordering AS s_ordering, cc.ordering AS cc_ordering, a.ordering AS a_ordering, f.ordering AS f_ordering FROM jos_content AS a INNER JOIN jos_content_frontpage AS f ON f.content_id = a.id LEFT JOIN jos_categories AS cc ON cc.id = a.catid LEFT JOIN jos_sections AS s ON s.id = a.sectionid LEFT JOIN jos_users AS u ON u.id = a.created_by LEFT JOIN jos_groups AS g ON a.access = g.id WHERE 1 AND a.access <= 0 AND a.state = 1 AND (( cc.published = 1 AND s.published = 1 ) OR ( a.catid = 0 AND a.sectionid = 0 ) ) AND ( a.publish_up = '0000-00-00 00:00:00' OR a.publish_up <= '2009-09-03 09:14:09' ) AND ( a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2009-09-03 09:14:09' ) ORDER BY  f.ordering
     38 Query       SELECT id, title, module, position, content, showtitle, control, params FROM jos_modules AS m LEFT JOIN jos_modules_menu AS mm ON mm.moduleid = m.id WHERE m.published = 1 AND m.access <= 0 AND m.client_id = 0 AND ( mm.menuid = 1 OR mm.menuid = 0 ) ORDER BY position, ordering
     38 Query       SELECT id, title, CASE WHEN CHAR_LENGTH(alias) THEN CONCAT_WS(':', id, alias) ELSE id END as slug  FROM jos_polls WHERE id = 14 AND published = 1
     38 Query       SELECT id, text FROM jos_poll_data WHERE pollid = 14 AND text <> "" ORDER BY id
     38 Query       SELECT guest, usertype, client_id FROM jos_session WHERE client_id = 0
     38 Query       SELECT * FROM jos_banner WHERE showBanner = 1 AND (imptotal = 0 OR impmade < imptotal) AND catid = 14 ORDER BY sticky DESC, ordering
     38 Query       UPDATE jos_banner SET impmade = impmade + 1 WHERE bid = 3
     38 Query       UPDATE jos_banner SET impmade = impmade + 1 WHERE bid = 4
     38 Query       UPDATE jos_banner SET impmade = impmade + 1 WHERE bid = 5
     38 Query       UPDATE jos_banner SET impmade = impmade + 1 WHERE bid = 6
     38 Query       SELECT *, RAND() AS ordering FROM jos_banner WHERE showBanner = 1 AND (imptotal = 0 OR impmade < imptotal) AND cid = 1 AND catid = 33 ORDER BY sticky DESC, ordering
     38 Query       UPDATE jos_banner SET impmade = impmade + 1 WHERE bid = 8
     38 Query       UPDATE jos_banner SET impmade = impmade + 1 WHERE bid = 7
     38 Query       SELECT a.*, CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug, CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug FROM jos_content AS a LEFT JOIN jos_content_frontpage AS f ON f.content_id = a.id INNER JOIN jos_categories AS cc ON cc.id = a.catid INNER JOIN jos_sections AS s ON s.id = a.sectionid WHERE ( a.state = 1 AND s.id > 0 ) AND ( a.publish_up = '0000-00-00 00:00:00' OR a.publish_up <= '2009-09-03 09:14:09' ) AND ( a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2009-09-03 09:14:09' ) AND a.access <= 0 AND cc.access <= 0 AND s.access <= 0 AND s.published = 1 AND cc.published = 1 ORDER BY a.hits DESC
090903 13:14:10      38 Query       SELECT a.*,  CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug, CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug FROM jos_content AS a INNER JOIN jos_categories AS cc ON cc.id = a.catid INNER JOIN jos_sections AS s ON s.id = a.sectionid WHERE a.state = 1 AND ( a.publish_up = '0000-00-00 00:00:00' OR a.publish_up <= '2009-09-03 09:14:09' ) AND ( a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2009-09-03 09:14:09' ) AND s.id > 0 AND a.access <= 0 AND cc.access <= 0 AND s.access <= 0 AND s.published = 1 AND cc.published = 1 ORDER BY a.created DESC
     38 Query       SELECT a.*, CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug, CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug FROM jos_content AS a INNER JOIN jos_categories AS cc ON cc.id = a.catid INNER JOIN jos_sections AS s ON s.id = a.sectionid WHERE a.state = 1  AND a.access <= 0 AND cc.access <= 0 AND s.access <= 0 AND (a.publish_up = '0000-00-00 00:00:00' OR a.publish_up <= '2009-09-03 09:14:09' )  AND (a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2009-09-03 09:14:09' ) AND cc.id = 3 AND cc.section = s.id AND cc.published = 1 AND s.published = 1 ORDER BY a.ordering
     38 Query       SELECT * FROM jos_session WHERE session_id = '5a2bfbaed29474f6dcbbe9e1b9aa2b48'
     38 Query       UPDATE `jos_session` SET `time`='1251969249',`userid`='0',`usertype`='',`username`='',`gid`='0',`guest`='1',`client_id`='0',`data`='__default|a:8:{s:15:\"session.counter\";i:32;s:19:\"session.timer.start\";i:1251968538;s:18:\"session.timer.last\";i:1251969159;s:17:\"session.timer.now\";i:1251969249;s:22:\"session.client.browser\";s:47:\"Opera/9.64 (Windows NT 5.1; U; ru) Presto/2.1.1\";s:8:\"registry\";O:9:\"JRegistry\":3:{s:17:\"_defaultNameSpace\";s:7:\"session\";s:9:\"_registry\";a:1:{s:7:\"session\";a:1:{s:4:\"data\";O:8:\"stdClass\":0:{}}}s:7:\"_errors\";a:0:{}}s:4:\"user\";O:5:\"JUser\":19:{s:2:\"id\";i:0;s:4:\"name\";N;s:8:\"username\";N;s:5:\"email\";N;s:8:\"password\";N;s:14:\"password_clear\";s:0:\"\";s:8:\"usertype\";N;s:5:\"block\";N;s:9:\"sendEmail\";i:0;s:3:\"gid\";i:0;s:12:\"registerDate\";N;s:13:\"lastvisitDate\";N;s:10:\"activation\";N;s:6:\"params\";N;s:3:\"aid\";i:0;s:5:\"guest\";i:1;s:7:\"_params\";O:10:\"JParameter\":7:{s:4:\"_raw\";s:0:\"\";s:4:\"_xml\";N;s:9:\"_elements\";a:0:{}s:12:\"_elementPath\";a:1:{i:0;s:58:\"W:\\home\\joomla\\www\\libraries\\joomla\\html\\parameter\\element\";}s:17:\"_defaultNameSpace\";s:8:\"_default\";s:9:\"_registry\";a:1:{s:8:\"_default\";a:1:{s:4:\"data\";O:8:\"stdClass\":0:{}}}s:7:\"_errors\";a:0:{}}s:9:\"_errorMsg\";N;s:7:\"_errors\";a:0:{}}s:13:\"session.token\";s:32:\"a5f9b8f7865533bd0eaa640f062c911d\";}' WHERE session_id='5a2bfbaed29474f6dcbbe9e1b9aa2b48'
     38 Quit 


всего получается 32 запроса
переподключения класса обертки плагина начинается после строчки 38 Init DB     Joomla (2-ая инициализация)
получается в нашем арсенале 20 запросов, не влетают сюда инициализация сессии и прочие системные радости Joomlа
все не так плохо впринципе =)
« Последнее редактирование: 03.09.2009, 13:22:36 от enshtein »
*

Physicist

  • Глобальный модератор
  • 984
  • 194 / 0
  • Рябов Денис
Re: Установить hook на запросы к БД
« Ответ #19 : 03.09.2009, 13:22:07 »
Читать внимательнее надо :) проблему не решили )

Смотреть исходники Query Cache внимательней надо.
*

enshtein

  • Захожу иногда
  • 77
  • 9 / 0
Re: Установить hook на запросы к БД
« Ответ #20 : 03.09.2009, 13:25:04 »
Смотреть исходники Query Cache внимательней надо.
а зачем же тогда параметр Time To Live: 300
если я правильно понимаю этот параметр означает время жизни кэша, или же вы хотите сказать что там событийная модель работы с кэшем?
*

Physicist

  • Глобальный модератор
  • 984
  • 194 / 0
  • Рябов Денис
Re: Установить hook на запросы к БД
« Ответ #21 : 03.09.2009, 13:32:03 »
Это «для страховки», никто не мешает выставить его, например, в 500000000 и забыть.

А дальше смотрим код метода qcache_main::check_clear

	
function 
check_clear($query$prefix) {
	
	
if((
strstr(strtoupper($query),'SELECT') || strstr(strtoupper($query),'SET')) && !strstr(strtoupper($query),'INSERT') && !strstr(strtoupper($query),'UPDATE') && !strstr(strtoupper($query),'REPLACE') && !strstr(strtoupper($query),'ALTER') && ! strstr(strtoupper($query),'DELETE')) {
	
	
	
//Read Only Query
	
	
	
return 
false;
	
	
}
	
	
$tables qcache_backend::get_tables($query$prefix);
	
	
$ids qcache_backend::get_ids($tables);
	
	
foreach(
$ids AS $val) {
	
	
	
qcache_backend::_delete($val);
	
	
}
	
	
foreach(
$tables AS $table) {
	
	
	
qcache_backend::_delete(QCACHE_SITE_ID.'_qcache_tables_'.$table);
	
	
}
	
}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не могу установить ни один модуль корректно

Автор sin0ptik

Ответов: 2
Просмотров: 2161
Последний ответ 22.03.2011, 17:33:08
от sin0ptik
Запросы и глобальные переменные в модуле

Автор mijsvit

Ответов: 13
Просмотров: 3130
Последний ответ 25.05.2009, 16:21:58
от maximator666