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

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Заголовки HTTP
« : 31.10.2010, 14:56:08 »
Как в Joomla настроить заголовки HTTP? Чтобы в ответе было то, что нужно, правильная инфа.
В частности интересует имя Last-Modified. У меня сейчас отдается значение "настоящие время, время запроса". То есть то время когда я делаю запрос. Например я сделал запрос в 11:06 GMT и в ответ вижу
Last-Modified: Sun, 31 Oct 2010 11:06:33 GMT
Страница динамическая, но! У меня в кеше яндекса старая копия! А я давно поменял текст. Нужно, чтобы это значение было корректным.

Еще имя Expires.
Expires: Mon, 1 Jan 2001 00:00:00 GMT
То есть страница устарела очень давно. Не знаю, как быть с этим значением. Есть ли смысл его менять?

Подскажите где настроить эти параметры.
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #1 : 31.10.2010, 15:15:29 »
В материалах можно ведь настроить отображение последнего изменения документа. Значит надо сделать, чтобы в Last-Modified отдавалось это значение. Только - как?  :)
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #2 : 01.11.2010, 18:31:46 »
\www\libraries\joomla\environment\response.php
в этом файле, строка 199
Код
JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s"). ' GMT', true );

в файла вывода материалов
Код
<?php if ( intval($this->article->modified)!=0 && $this->params->get('show_modify_date')) : ?>
<tr>
<td class="modifydate">
<?php echo JText::sprintf('LAST_UPDATED2', JHTML::_('date', $this->article->modified, JText::_('DATE_FORMAT_LC2'))); ?>
</td>
</tr>

Что написать вместо gmdate("D, d M Y H:i:s") чтобы выводилась дата изменения материала?
Подскажите, пожалуйста!

Re: Заголовки HTTP
« Ответ #3 : 01.11.2010, 19:52:07 »
Посмотрите (HTTPWatch, LieveHeaders для firefox), какие реально заголовки отдает веб-сервер. Возможно проблема не в jooml'e

Цитировать
Что написать вместо gmdate("D, d M Y H:i:s")

У вас выводится текущее время в Last-Modified, если закоментируете эту строку - будет выдаваться время модификации файла

*

TTL

  • Захожу иногда
  • 163
  • 10 / 0
  • Мы друзья, не то что другие))
Re: Заголовки HTTP
« Ответ #4 : 01.11.2010, 20:32:21 »
Вам нужно реальную дату изменения документа нужно передать?
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #5 : 01.11.2010, 20:38:31 »
Посмотрите (HTTPWatch, LieveHeaders для firefox), какие реально заголовки отдает веб-сервер. Возможно проблема не в jooml'e

У вас выводится текущее время в Last-Modified, если закоментируете эту строку - будет выдаваться время модификации файла
Если закоментировать Last-Modified, то он вообще выводится. Да и время изменения файла тоже не правльно будет, ведь файл не меняется. Меняется содержимое в БД.

HTTP/1.1 200 OK
Date: Mon, 01 Nov 2010 17:23:06 GMT
...
Expires: Mon, 1 Jan 2001 00:00:00 GMT
Last-Modified: Mon, 01 Nov 2010 17:23:07 GMT
...

Кстати If-Modified-Since тоже не выводится. Только я не уверен, должно ли это имя выводится для страницы.
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #6 : 01.11.2010, 20:39:22 »
Вам нужно реальную дату изменения документа нужно передать?
Ну да. Ту дату, которая выводится, если в опциях материала включить вывод даты последнего редактирования материала.
*

TTL

  • Захожу иногда
  • 163
  • 10 / 0
  • Мы друзья, не то что другие))
Re: Заголовки HTTP
« Ответ #7 : 01.11.2010, 20:54:33 »
Можно сделать hack. Грязновато конечно, но если стоит задача.
И Конечно не забываем делать копии изменяемых документов.
Редактируем libraries/joomla/document/document.php

  /**
         * Outputs the document
         *
         * @access public
         * @param boolean       $cache          If true, cache the output
         * @param boolean       $compress       If true, compress the output
         * @param array         $params         Associative array of attributes
         * @return      The rendered data
         */
        function render( $cache = false, $params = array())
        {   
                JResponse::setHeader( 'Expires', gmdate( 'D, d M Y H:i:s', time() + 900 ). ' GMT' );
                if ($mdate = $this->getModifiedDate()) {
                        JResponse::setHeader( 'Last-Modified', $mdate /* gmdate( 'D, d M Y H:i:s', time() + 900 ). ' GMT' */ );
                }   
                JResponse::setHeader( 'Content-Type', $this->_mime .  '; charset=' . $this->_charset);
                ## Наш hack  last-modified date . Вставляем код ##
                $content =& $this->_buffer['component'][''];
                if(preg_match_all('/(?><span class="createdate">[\s]*)([^<]*)/',$content,$matches))
                {   
                        if(!empty($matches[1]))
                        {   
                                $i = 0;
                                $num = count($matches[1]);
                                $lastmod = 0;
                                while($i < $num)
                                {   
                                        $date = strtotime($matches[1][$i]);
                                        if($date > $lastmod)
                                        {   
                                                $lastmod = $date;
                                        }   
                                        ++$i;
                                }   
                                $lastmod = gmdate('D, d M Y H:i:s',$lastmod). ' GMT';
                                JResponse::setHeader('Last-Modified',$lastmod);
                        }
                 }
                 ## конец hack ##
         }

------------------------------------------------------------------------------
Редактируем libraries/joomla/environment/response.php

      /**
         * Sends all headers prior to returning the string
         *
         * @access public
         * @param boolean       $compress       If true, compress the data
         * @return string
         */
        function toString($compress = false)
        {   
                $data = JResponse::getBody();
 
                // Don't compress something if the server is going todo it anyway. Waste of time.
                if($compress && !ini_get('zlib.output_compression') && ini_get('output_handler')!='ob_gzhandler') {
                        $data = JResponse::_compress($data);
                }   
 
                if (JResponse::allowCache() === false)
                {   
                        JResponse::setHeader( 'Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true );
                       ## закоментируем строку ##
                       # JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s"). ' GMT', true ); 
                       ## end hack  ##
                        JResponse::setHeader( 'Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false);
                        JResponse::setHeader( 'Pragma', 'no-cache' );                           
                }   
 
                JResponse::sendHeaders();
                return $data;
        }
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #8 : 01.11.2010, 23:53:10 »
TTL, к сожалению не работает. Last-Modified не выводится вообще.
*

TTL

  • Захожу иногда
  • 163
  • 10 / 0
  • Мы друзья, не то что другие))
Re: Заголовки HTTP
« Ответ #9 : 02.11.2010, 00:23:38 »
В 1.5.20 Работает.
_______________________________________________________________________
Еще можно вывести при помощи апача, добавить в htaccess php_flag last_modified 1
и соответственно закоментировать в response
#JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s"). ' GMT', true );

*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #10 : 05.11.2010, 09:55:33 »
В 1.5.20 Работает.
_______________________________________________________________________
Еще можно вывести при помощи апача, добавить в htaccess php_flag last_modified 1
и соответственно закоментировать в response
#JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s"). ' GMT', true );
Выводит дату файла index.php который в корне сайта.
*

Physicist

  • Глобальный модератор
  • 984
  • 194 / 0
  • Рябов Денис
Re: Заголовки HTTP
« Ответ #11 : 05.11.2010, 13:37:22 »
Идеологически правильным решением было бы написать плагин, который будет обрабатывать onPrepareContent, и на основе полученных данных о статье будет выставлять дату генерации через $doc->setModifiedDate($date_in_GMT) и разрешать использование этой даты через JResponse::allowCache(true).
*

TTL

  • Захожу иногда
  • 163
  • 10 / 0
  • Мы друзья, не то что другие))
Re: Заголовки HTTP
« Ответ #12 : 05.11.2010, 23:14:38 »
Идеологически правильным решением было бы написать плагин, который будет обрабатывать onPrepareContent, и на основе полученных данных о статье будет выставлять дату генерации через $doc->setModifiedDate($date_in_GMT) и разрешать использование этой даты через JResponse::allowCache(true).
К сожалению готового плагина нет. Вы бы написали Денис, пользовался бы спросом, Last-Modified для Seo очень нужная вещь.
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Заголовки HTTP
« Ответ #13 : 06.11.2010, 12:16:31 »
Я думал сделать нормальный Last-Modified просто. А оказывается нет.
Наличие плагина, безусловно, являлось бы огромным плюсом, но пока его нет, есть ли еще варианты, как вывести нормальное время в Last-Modified?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

404 ошибка при обращении http://site.ru/index.php

Автор Oleg Inishev

Ответов: 2
Просмотров: 1720
Последний ответ 19.05.2017, 14:18:30
от SeBun
Заголовки HTTP

Автор julyca

Ответов: 11
Просмотров: 2270
Последний ответ 12.07.2015, 09:56:16
от altvvc
Как выровнять заголовки страниц по центру и увеличить

Автор artruslan

Ответов: 14
Просмотров: 4181
Последний ответ 04.12.2014, 21:06:48
от Shustry
Можно ли на joolma организовать видеочат например как сдесь http://www.ruskams.com/

Автор joomler

Ответов: 6
Просмотров: 4974
Последний ответ 19.11.2013, 19:16:23
от Master Tigra team
Разные заголовки статьи и title, плагин pageTitle

Автор eugene_o

Ответов: 1
Просмотров: 2176
Последний ответ 05.06.2013, 10:01:22
от eugene_o