Форум русской поддержки Joomla!® CMS
10.12.2016, 16:50:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2 3 4 5 6 7   Вниз
  Добавить закладку  |  Печать  
Автор

Хаки для убыстрения VirtueMart (уменьшение запросов и т.п.)

 (Прочитано 65702 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yadrinez
Осваиваюсь на форуме
***

Репутация: +9/-0
Offline Offline

Сообщений: 108


« : 26.11.2009, 21:38:07 »

 Предлагаю помещать в эту тему простые хаки для улучшения производительности VirtueMart.
Сам я недавно ковыряюсь в нем.
Сегодня например сделал следующее:
В файле ps_product.php есть функция function get_flypage($product_id),
которая возвращает шаблон товара.
Внутри функции есть запрос от которого я предполагаю можно избавиться, если шаблон для отображения товара используем один.

Первоначальная функция
Код:
function get_flypage($product_id) {


if( empty( $_SESSION['product_sess'][$product_id]['flypage'] )) {
$db = new ps_DB;
$productParentId = (int)$product_id;
do {
$q = "SELECT
                                `#__{vm}_product`.`product_parent_id` AS product_parent_id,
                                `#__{vm}_category`.`category_flypage`
                        FROM
                                `#__{vm}_product`

                        LEFT JOIN `#__{vm}_product_category_xref` ON `#__{vm}_product_category_xref`.`product_id` = `#__{vm}_product`.`product_id`
                        LEFT JOIN `#__{vm}_category` ON `#__{vm}_product_category_xref`.`category_id` = `#__{vm}_category`.`category_id`

                        WHERE `#__{vm}_product`.`product_id`='$productParentId'
                        ";
$productParentId = $db->f("product_parent_id");
$db->query($q);
$db->next_record();
}
while( $db->f("product_parent_id") && !$db->f("category_flypage"));

if ($db->f("category_flypage")) {
$_SESSION['product_sess'][$product_id]['flypage'] = $db->f("category_flypage");
} else {
$_SESSION['product_sess'][$product_id]['flypage'] = FLYPAGE;
}
}
return $_SESSION['product_sess'][$product_id]['flypage'];
}

Функция после переделки
Код:
function get_flypage($product_id) {
$_SESSION['product_sess'][$product_id]['flypage'] = "mypage.tpl";
return $_SESSION['product_sess'][$product_id]['flypage'];
}

Я принудительно задаю шаблон для отображения страницы "mypage.tpl"
Так как на сайте всегда использую только его
Записан
 
smart
Администратор
*******

Репутация: +1308/-14
Offline Offline

Пол: Мужской
Сообщений: 6850


снова дома...


« Ответ #1 : 26.11.2009, 22:05:11 »

В оригинальном коде, запрос выполняется один раз, а потом значение хранится в сессии, это все понятно. Но зачем в вашей функции использовать сессию? По-моему проще эту функцию записать вот так:

Код
function get_flypage($product_id) {
return 'mypage.tpl';
}
Записан
intcorp
Завсегдатай
*****

Репутация: +12/-0
Offline Offline

Сообщений: 412


« Ответ #2 : 02.12.2009, 14:13:05 »

Единственный "фишка"для оптимизации вирта и та не подходит под мой случай (используются разные шаблоны)
Записан
yadrinez
Осваиваюсь на форуме
***

Репутация: +9/-0
Offline Offline

Сообщений: 108


« Ответ #3 : 06.12.2009, 15:12:40 »

Заметил что VirtueMart в некоторых случаях часто гоняет запросы вида
Код:
SELECT tax_rate
  FROM jos_vm_product, jos_vm_tax_rate
  WHERE product_tax_id=tax_rate_id
  AND product_id=401

Например при просмотре корзины.
Версия VirtueMart у меня VM 1.1.4
Привожу для случая когда налоговая ставка вычисляется в зависимости от адреса продавца
Обнаружил что в файле ps_product.php 
в функции function get_product_taxrate( $product_id, $weight_subtotal=0, $ship_to_info_id = '' )
в условии elseif( ps_checkout::tax_based_on_vendor_address ( $ship_to_info_id ) ) {
которая возвращает налоговую ставку для продукта в зависимости от адреса продавца закомментированы
строки
1601//   if( empty( $_SESSION['product_sess'][$product_id]['tax_rate'] ) ) {
1622//         }
1623//         else {
1624//            return $_SESSION['product_sess'][$product_id]['tax_rate'];
1625//         }

Я их расскоментировал чтобы ставка для продукта бралась из сессии (если есть).
для корзины кол-во запросов сразу упало на четверть.


По идее если налогавая ставка одна можно вообще переписать функциии для них (их две)
чтобы они всегда возвращали константу например 0.18 или 0 и не гоняли запорсов к базе.



Записан
Sulpher
Практически профи
*******

Репутация: +386/-15
Offline Offline

Пол: Мужской
Сообщений: 2214


Шаблоны и расширения Joomla


« Ответ #4 : 08.12.2009, 05:43:58 »

Попробовал оба предлагаемых решения - снижения кол-ва запросов в отладочном режиме не заметил.
Записан
KoHb
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 17



« Ответ #5 : 08.12.2009, 11:08:57 »

увеличил производительность магазина в 2 раза при выводе списка товаров следующим образом.
В shop.browse.php информация о товарах собирается в цикле
while ($db_browse->next_record()){
        ...
         
}// END OF while loop
При каждом запуске информация о товарах расчитывается заново, что не есть хорошо, поэтому выносим расчеты информации о товаре в отдельную функцию и вызываем эту функцию через  $cache->call(), где $cache = & JFactory::getCache();


Записан
everestrus
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 97


Moto на территории UA


« Ответ #6 : 15.12.2009, 16:28:15 »

а по подробнее
Записан
M@X1M
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 47


« Ответ #7 : 18.12.2009, 08:58:03 »

В ps_session->url() закомментировал селекты id из #__menu. Как я понял, они нужны только, если в меню Joomla есть пункты-ссылки на категории или товары VirtueMart. У меня же используется mod_product_categories для меню магазина. Хотя могу быть и не прав, сильно не разбирался, но все работает, а количество запросов уменьшилось на 29 штук.

Есть еще несколько мелких доработок по 1-3 запроса. Если интересно могу выложить, но они все специфические в основном (отключение ненужного функционала).
Записан
TrOn
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 89


« Ответ #8 : 18.01.2010, 15:01:22 »

увеличил производительность магазина в 2 раза при выводе списка товаров следующим образом.
В shop.browse.php информация о товарах собирается в цикле
while ($db_browse->next_record()){
        ...
         
}// END OF while loop
При каждом запуске информация о товарах расчитывается заново, что не есть хорошо, поэтому выносим расчеты информации о товаре в отдельную функцию и вызываем эту функцию через  $cache->call(), где $cache = & JFactory::getCache();




А подробнее описать? уж очень надо
Записан
vlades
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Сообщений: 19


« Ответ #9 : 30.01.2010, 16:39:08 »

У меня очень большие проблемы со скорость в VirtueMart , товаров около 16000 , страница с товарами генеририруется больше 3 секунд (от перегрузок сервера спасает только кэширование), цены обновляются часто и кэш приходиться чистить часто. а файл кэша создаётся больше 3 секунд .... вообщем ну очень долго

Наткнулся на плагин SpeedBooster для VirtueMart
авторы обещают ускорение на 80%
До:
Код:
Application afterRender: 2.285 seconds, 13.04 MB
128 queries logged
После:
Код:
Application afterRender: 0.861 seconds, 12.96 MB
48 queries logged
Он платный: 20 фунтов
но это не много за такой результат

Ктонибудь пользовался этим плагином ?
Интерисует реальный результат

Инфо на VirtueMart.net - http://extensions.virtuemart.net/index.php?option=com_sobi2&sobi2Task=sobi2Details&catid=1&sobi2Id=327&Itemid=
Инфо на офф сайте - http://codingmall.com/products-mainmenu-8/65-speed-up-virtuemart
Записан
everestrus
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 97


Moto на территории UA


« Ответ #10 : 30.01.2010, 17:28:31 »

а там же у них можно попросить тестовою версию
Записан
vlades
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Сообщений: 19


« Ответ #11 : 30.01.2010, 19:44:47 »

незаметил ... буду просить

ещё покапался на forum.virtuemart.net там советуют быстрые серверы MySQL с большими пропускными каналами
там приводились примеры магазинов с 300 000 товаров которые достаточно шустро работают
Записан
era
Администратор
*******

Репутация: +383/-5
Offline Offline

Пол: Мужской
Сообщений: 1699


В туалете лучше быть пользователем, чем админом.


« Ответ #12 : 30.01.2010, 19:55:01 »

ещё покапался на forum.virtuemart.net там советуют быстрые серверы MySQL с большими пропускными каналами
это примерно тоже что на вопрос "почему американские трактора в 3-и раза эффективней белорусских", ответить: "просто надо белорусские трактора в три раза больше по размерам сделать"
Записан
everestrus
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 97


Moto на территории UA


« Ответ #13 : 02.02.2010, 10:43:40 »

У меня очень большие проблемы со скорость в VirtueMart , товаров около 16000 , страница с товарами генеририруется больше 3 секунд (от перегрузок сервера спасает только кэширование), цены обновляются часто и кэш приходиться чистить часто. а файл кэша создаётся больше 3 секунд .... вообщем ну очень долго

Наткнулся на плагин SpeedBooster для VirtueMart
авторы обещают ускорение на 80%
До:
Код:
Application afterRender: 2.285 seconds, 13.04 MB
128 queries logged
После:
Код:
Application afterRender: 0.861 seconds, 12.96 MB
48 queries logged
Он платный: 20 фунтов
но это не много за такой результат

Ктонибудь пользовался этим плагином ?
Интерисует реальный результат

Инфо на VirtueMart.net - http://extensions.virtuemart.net/index.php?option=com_sobi2&sobi2Task=sobi2Details&catid=1&sobi2Id=327&Itemid=
Инфо на офф сайте - http://codingmall.com/products-mainmenu-8/65-speed-up-virtuem
незаметил ... буду просить

ещё покапался на forum.virtuemart.net там советуют быстрые серверы MySQL с большими пропускными каналами
там приводились примеры магазинов с 300 000 товаров которые достаточно шустро работают
art[/url]
Вообщем дали они мне этот плагин тестовый, сказали типа что это полностью функциональный плагин только будет выкидывать лицензию!
не знаю толи я что то не так сделал (но вроде все перепробовал) у меня как было 620 запросов, так и осталось! да и еще к тому в панелька там где производители, когда выбираеш производителся то оно мне на главную страницу магазина перекидывает! когда выключил все окей!
Записан
Sulpher
Практически профи
*******

Репутация: +386/-15
Offline Offline

Пол: Мужской
Сообщений: 2214


Шаблоны и расширения Joomla


« Ответ #14 : 02.02.2010, 11:47:49 »

everestrus, не пробовал с ними связаться на предмет вопроса почему кол-во запросов не уменьшается?
Записан
everestrus
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 97


Moto на территории UA


« Ответ #15 : 02.02.2010, 12:00:13 »

everestrus, не пробовал с ними связаться на предмет вопроса почему кол-во запросов не уменьшается?
написал пока жду ответа!
Записан
everestrus
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 97


Moto на территории UA


« Ответ #16 : 02.02.2010, 14:08:38 »

вообщем вот написали ответ It works on product detail pages.
ну это не сильно мне нравится, у меня 600 запросов при открытии категории! а тут только на продукты!
Записан
Sulpher
Практически профи
*******

Репутация: +386/-15
Offline Offline

Пол: Мужской
Сообщений: 2214


Шаблоны и расширения Joomla


« Ответ #17 : 02.02.2010, 14:49:35 »

что и следовало ожидать Azn честно говоря, я скептически отнёсся к данному акселлератору. тут нужно код VirtueMart править, а не плагины ставить.
Записан
vlades
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Сообщений: 19


« Ответ #18 : 02.02.2010, 20:25:30 »

Цитировать
Вообщем дали они мне этот плагин тестовый, сказали типа что это полностью функциональный плагин только будет выкидывать лицензию!
не знаю толи я что то не так сделал (но вроде все перепробовал) у меня как было 620 запросов, так и осталось! да и еще к тому в панелька там где производители, когда выбираеш производителся то оно мне на главную страницу магазина перекидывает! когда выключил все окей!
у меня тоже самое
Записан
haword
Осваиваюсь на форуме
***

Репутация: +25/-0
Offline Offline

Сообщений: 124


« Ответ #19 : 17.02.2010, 16:29:50 »

проверьте эффективность и моей оптимизации на скорость показа
1)
в shop.browse.php ищем
$files = ps_product_files::getFilesForProduct( $db_browse->f('product_id'));
и заменяем на
$files = ps_product_files::getFilesForProduct( $db_browse->f('product_id'), $db_browse->f('product_parent_id') );

2)
в ps_product_files.php ищем
function getFilesForProduct( $pid ) {
.....
}
и заменяем все ее на
Код:
function getFilesForProduct( $pid, $ppid = -1 ) {
$db= new ps_DB();
$files['images'] = array();
$files['files'] = array();
// Query for images if child doesn't have them check for parents
                                if ($ppid < 0 ) {
     $db->query( "SELECT product_parent_id FROM `#__{vm}_product`  WHERE `product_id`=".intval($pid) );
   $ppid = $db->f("product_parent_id");
}
$db->query( "SELECT * FROM `#__{vm}_product_files` WHERE `file_product_id`=".intval($pid)." AND `file_published`=1" );
if(!$db->next_record()) {
 if ($ppid > 0 ) {
     $db->query("SELECT * FROM `demo_jos_vm_product_files` WHERE `file_product_id` = ".$ppid." AND `file_published` =1");
        $db->reset();
              while( $db->next_record() )
                                         {
                                               if ( $db->f("file_is_image") == 1)
                                                     {
                 $files['images'][] = $db->get_row();
   }
        else
             {  $files['files'][] = $db->get_row();}
                                        }
  }
}
                                else
{
        $db->reset();
              while( $db->next_record() ) {
                                               if ($db->f("file_is_image") == 1)
                                                     {
                 $files['images'][] = $db->get_row();
   }
        else
              { $files['files'][] = $db->get_row();}
    }
}
return $files;
}
« Последнее редактирование: 18.02.2010, 20:59:06 от haword » Записан
everestrus
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 97


Moto на территории UA


« Ответ #20 : 17.02.2010, 16:32:45 »

А каков должен быть результат?
Записан
Sulpher
Практически профи
*******

Репутация: +386/-15
Offline Offline

Пол: Мужской
Сообщений: 2214


Шаблоны и расширения Joomla


« Ответ #21 : 17.02.2010, 16:35:54 »

Господа, если выкладываете решение, просьба описать какой будет выигрыш.
Записан
haword
Осваиваюсь на форуме
***

Репутация: +25/-0
Offline Offline

Сообщений: 124


« Ответ #22 : 17.02.2010, 17:17:46 »

уменьшится время создания страницы, при одинаковых условиях должно уменьшиться количество запросов на  - "кол. показываемого товара" * 3 поэтому проверьте скорость обработки уменьшилась или нет
Записан
haword
Осваиваюсь на форуме
***

Репутация: +25/-0
Offline Offline

Сообщений: 124


« Ответ #23 : 18.02.2010, 12:24:05 »

еще одна модификация, проверил только на показе товара, поиск пока не работает, VM 1.1.4, старый файл переименовываем новый заливаем. Проверьте на БОЛЬШОМ количестве товара так как на малом думаю эффекта не будет. Должно уменьшится время формирования страницы. Надеюсь что дождусь ответа, если нет буду на других форумах отдавать тестировать.

[вложение удалено Администратором]
« Последнее редактирование: 18.02.2010, 13:05:02 от haword » Записан
cadet
Давно я тут
****

Репутация: +17/-0
Offline Offline

Пол: Мужской
Сообщений: 239


« Ответ #24 : 18.02.2010, 18:21:13 »

еще одна модификация, проверил только на показе товара, поиск пока не работает, VM 1.1.4, старый файл переименовываем новый заливаем. Проверьте на БОЛЬШОМ количестве товара так как на малом думаю эффекта не будет. Должно уменьшится время формирования страницы. Надеюсь что дождусь ответа, если нет буду на других форумах отдавать тестировать.

Проверил на магазине с 3000 товаров. Просмотр главной страницы магазина.
Результат:
Было:
Код:
Информация о профиле
Application afterLoad: 0.003 seconds, 0.27 MB
Application afterInitialise: 0.099 seconds, 2.72 MB
Application afterRoute: 0.137 seconds, 4.24 MB
Application afterDispatch: 0.363 seconds, 10.18 MB
Application afterRender: 1.241 seconds, 13.09 MB
Использование памяти
13776304
Зарегистрировано запросов: 746

Стало:
Код:
Информация о профиле
Application afterLoad: 0.003 seconds, 0.27 MB
Application afterInitialise: 0.080 seconds, 2.73 MB
Application afterRoute: 0.120 seconds, 4.25 MB
Application afterDispatch: 0.342 seconds, 10.19 MB
Application afterRender: 1.114 seconds, 13.10 MB
Использование памяти
13782296
Зарегистрировано запросов: 746
Записан
cadet
Давно я тут
****

Репутация: +17/-0
Offline Offline

Пол: Мужской
Сообщений: 239


« Ответ #25 : 18.02.2010, 18:36:36 »

проверьте эффективность и моей оптимизации на скорость показа
Проверил на VirtueMart 1.1.4 (3000 товаров) просмотр главной страницы магазина.

В  ps_product_files.php не нашел
Код:
function getFilesForProduct( $pid, $ppid = -1 ) {

нашел
Код:
function getFilesForProduct( $pid ) {

После замены результат
Было
Код:
Информация о профиле
Application afterLoad: 0.003 seconds, 0.27 MB
Application afterInitialise: 0.071 seconds, 2.74 MB
Application afterRoute: 0.099 seconds, 4.26 MB
Application afterDispatch: 0.311 seconds, 10.20 MB
Application afterRender: 0.959 seconds, 13.11 MB
Использование памяти
13796656
Зарегистрировано запросов: 745

Стало
Код:
Информация о профиле
Application afterLoad: 0.004 seconds, 0.27 MB
Application afterInitialise: 0.078 seconds, 2.75 MB
Application afterRoute: 0.109 seconds, 4.27 MB
Application afterDispatch: 0.334 seconds, 10.21 MB
Application afterRender: 0.943 seconds, 13.12 MB
Использование памяти
13807608
Зарегистрировано запросов: 746


т.е. в пределах погрешности.


После включения кеша
Код:
Информация о профиле
Application afterLoad: 0.004 seconds, 0.27 MB
Application afterInitialise: 0.081 seconds, 2.85 MB
Application afterRoute: 0.109 seconds, 4.31 MB
Application afterDispatch: 0.324 seconds, 10.27 MB
Application afterRender: 0.904 seconds, 13.17 MB
Использование памяти
13858048
Зарегистрировано запросов: 745
« Последнее редактирование: 18.02.2010, 18:40:08 от cadet » Записан
haword
Осваиваюсь на форуме
***

Репутация: +25/-0
Offline Offline

Сообщений: 124


« Ответ #26 : 18.02.2010, 21:04:01 »

cadet все два шага сделал? вызов функции в shop.browse.php не забыл изменить? должно было сказаться при просмотре списка товаров в категории. уменьшится количество запросов.

а вторую модификацию пробовал? там нужно файл заменить и  проверить тоже на списке товара в каталоге. Поиск с ним пока не работает, а скорость возрасти должна была, если скорость повыситься доделаю поиск.
« Последнее редактирование: 18.02.2010, 21:07:22 от haword » Записан
cadet
Давно я тут
****

Репутация: +17/-0
Offline Offline

Пол: Мужской
Сообщений: 239


« Ответ #27 : 18.02.2010, 23:19:31 »

Проверял оба варианта. Проверял на локалке. Делал изменения по инструкции.

Проверял только на главной странице VirtueMart, там где категории
Записан
haword
Осваиваюсь на форуме
***

Репутация: +25/-0
Offline Offline

Сообщений: 124


« Ответ #28 : 19.02.2010, 00:19:58 »

эффект должен быть при просмотре списка товара в категории где и идут обычно тормоза.
Записан
cadet
Давно я тут
****

Репутация: +17/-0
Offline Offline

Пол: Мужской
Сообщений: 239


« Ответ #29 : 19.02.2010, 18:27:10 »

эффект должен быть при просмотре списка товара в категории где и идут обычно тормоза.
Проверял вариант №1 с двумя файлами. При просмотре категории с товарами получил результат:
Было
Код:
Информация о профиле
Application afterLoad: 0.003 seconds, 0.27 MB
Application afterInitialise: 0.104 seconds, 2.78 MB
Application afterRoute: 0.138 seconds, 4.26 MB
Application afterDispatch: 0.973 seconds, 12.72 MB
Application afterRender: 1.897 seconds, 14.75 MB
Использование памяти
15514368
Зарегистрировано запросов: 1011

Получил
Код:
Информация о профиле
Application afterLoad: 0.003 seconds, 0.27 MB
Application afterInitialise: 0.077 seconds, 2.80 MB
Application afterRoute: 0.137 seconds, 4.26 MB
Application afterDispatch: 0.636 seconds, 12.71 MB
Application afterRender: 1.372 seconds, 14.73 MB
Использование памяти
15497272
Зарегистрировано запросов: 934

т.е. результат есть.


Сейчас проверю второй вариант с заменой файла.
Записан
Страниц: [1] 2 3 4 5 6 7   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet