Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

RGB

Users
  • Posts

    6,970
  • Joined

  • Last visited

Everything posted by RGB

  1. Так я про фильтр ни слова не говорил - я его отключал, когда проверял изменения. О чем в моем сообщении и шла речь! Только я вместо * подставил все нужные поля конкретно из моего случая.
  2. До атрибутов я еще не добрался (первая попытка показала ухудшение результатов, но возможно виной тому мои кривые руки), но вот по исправлению начала самого первого запроса $query = $this->db->query("SELECT DISTINCT *, p.rating, pd.name AS name, p.image, m.name AS manufacturer, таким образом $query = $this->db->query("SELECT DISTINCT pd.name AS name, p.image, m.name AS manufacturer, ничего хорошего не дало - если убрать *, сыпятся нотисы: Вы проверяли это у себя? Мне кажется, нужно сделать так (по крайней мере, у меня так работает): $query = $this->db->query("SELECT DISTINCT p.product_id, p.price, p.tax_class_id, p.model, p.sku, p.quantity, p.stock_status_id, p.date_available, p.upc, pd.name AS name, p.image, m.name AS manufacturer,
  3. Нашел причины - реализация загрузчика. Насколько я понял, он работает быстрее (?) кеша браузера, а чтобы он ждал загрузки css, и уже после нее выполнял загрузку страницы (чтоб не мелькала голая страница без подключенных таблиц стилей), на гитхабе есть отдельная версия загрузчика. По цифрам получается достаточно интересно, хотя все зависит от того, насколько оптимально используются скрипты и таблицы стилей. У меня вот в хедере было прописано внешних 5 css и 10 js-файлов. Я загнал все это добро в загрузчик вот таким образом (jquery-1.7.1.min.js пришлось вынести до загрузчика): <script type="text/javascript" src="catalog/view/javascript/jquery/jquery-1.7.1.min.js"></script> <script src="catalog/view/javascript/yepnope.1.5.4-min.js"></script> <script type="text/javascript"> yepnope(['/catalog/view/theme/default/stylesheet/stylesheet.css', '/catalog/view/javascript/jquery/ui/themes/ui-lightness/jquery-ui-1.8.16.custom.css', '/catalog/view/javascript/jquery/colorbox/colorbox.css', '/catalog/view/theme/default/stylesheet/carousel.css', '/catalog/view/theme/default/stylesheet/livesearch.css', <?php foreach ($styles as $style) {echo "'/".$style['href']."', "; } ?>'/catalog/view/javascript/jquery/jquery.tooltip.js', '/catalog/view/javascript/jquery/ui/jquery-ui-1.8.16.custom.min.js', '/catalog/view/javascript/jquery/ui/external/jquery.cookie.js', '/catalog/view/javascript/jquery/colorbox/jquery.colorbox-min.js', '/catalog/view/javascript/jquery/tabs.js', '/catalog/view/javascript/jquery/jquery.jcarousel.min.js', '/catalog/view/javascript/common.js', '/catalog/view/javascript/livesearch.js', <?php foreach ($scripts as $script) {echo "'/".$script."', "; } ?> '/catalog/view/theme/default/extra/extra.js' ]); </script> В итоге получились такие цифры (отключил все модули, виджеты, метрики и т.п., мерял хромом через встроенный анализ по Timeline): Без асинхронного загрузчика Cache off: onload: 3.54 s, DOMContentLoaded: 3.40 s Cache on: onload: 1.08 s, DOMContentLoaded: 976 ms С асинхронным загрузчиком Cache off: onload: 3.27 s, DOMContentLoaded: 3.13 s Cache on: onload: 934 ms, DOMContentLoaded: 752 ms Выигрыш есть, но небольшой, возможно результаты будут лучше на более загруженных скриптами и стилями сайтах. Хорошая идея, надеюсь toporchillo исправит запросы, которые указали выше и выложит на гитхабе, а я всегда готов снова замерять эффективность и написать сюда уже в полном виде, что и как получилось оптимизировать. Я все тесты сначала делаю локально, чтобы увидеть есть ли смысл вообще переносить изменения в реальный магазин. Сегодня ночью попробую все эти изменения с начала темы проверить на самом магазине, пока посетителей будет мало чтобы ничего не сломать, как я умею :)
  4. А кто-нибудь использовал такой инструмент для оптимизации скорости загрузки страниц, как асинхронные загрузчики? Я вот прикрутил к сайту yepnope, но результаты как-то не впечатляют абсолютно - со скриптами все окей, но при обновлении страницы долю секунды (видимо, пока загрузчик подхватит основную таблицу стилей (из кеша?) ) отображается голая страница без стилей, потом все становится ок, но что самое странное - такая картина при каждом обновлении страницы, будто бы браузер не кеширует цсс-ки, загруженные асинхронно - а в таком случае какой в них смысл вообще? PS Забыл написать, такая картина только в хроме, фф и ие, опера и сафари не показывают страницу без стилей (или не успевают показать, или в них загрузчик работает быстрее) PPS По времени получился выигрыш 0.2 с, хотя тут сложно точно измерять
  5. для россии такой помню был, не знаю насколько он хороший, но мне не нравится, что вместо простого кредитного калькулятора там переход на страницу банка и всякая муть на их стороне
  6. убираем, получаем запрос $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id IN ('" . implode("','", array_keys($product_data)) . "')"); и рейтинг отображается, и время загрузки с кешем уменьшается до 1 с (а если отключить filterpro, то менше 0.5 с) - красота!
  7. Приложения под мобильные устройства есть, но смысл их использования - очень узкий сегмент магазинов, по-моему адаптивная верстка - решение гораздо более простое и удобное.
  8. Ну я то догадался, как исправить это, но ведь здесь и первоклашек хватает, да и не все первоклашки понимают что это и как это. Поставят, увидят сломавшуюся админку, подумают "Ах этот ужасный кривой оксторе, пойду лучше заминусую автора дополнения и скачаю красивую сборочку максисторе со всякими свистелками и перделками, там все ведь работает" :-)
  9. Если с категориями товаров, то еще проще. Покажу как у себя делал разные логотипы магазина в разных категориях (3 главные категории 1-го уровня вложенности, соответственно 3 файла лого - logo1.png, logo2.png, logo3.png, где 1,2,3 - айдишники главных категорий). У вас суть та же будет. Идем в \catalog\controller\common\header.php находим строку $this->data['categories'][] = array( и добавляем где-то там рядышком, например после: 'name' => $category['name'], 'category_id' => $category['category_id'], А потом в файле \catalog\view\theme\default\template\common\header.tpl в нужной секции делаем так: <img src="catalog/view/theme/default/image/logo<?php foreach ($categories as $category) {if ($category['active']) {echo $category['category_id'];break;}}?>.png" alt="" /> В рез-те получаем вывод разных вариантов лого на всех страницах главных категорий 1,2,3 (включая их дочерние категории), и вывод обычного лого (logo.png) на прочих страницах - поиск, статьи и т.п., где нет привязки к категориям. Думаю, логику вы должны были уловить.
  10. А у вас там как, ОС под рукой? Или вы по моим сообщениям отлаживаете модуль? :-) Попробуйте в админку зайти Fatal error: Class 'Debug' not found in \system\database\mysql.php on line 35
  11. А что вам мешает привязать к ид определенного товара некий фон, ну и в зависимости от товара выводить нужный фон?
  12. предлагаю автору сделать рандомный показ любых 4-х категорий из 13, так сказать поле чудес :-D
  13. Подсветку синтаксиса все равно не вижу :-) В остальном все работает. У кого как у меня - ужасно тормозит вывод лога sql-запросов при их большом кол-ве - все дело в цсс, нужно зайти в файл profilertoolbar.css и найти строчку #ptb table td{padding:1px 5px; text-align: left; vertical-align: top; border: 1px dotted #424242;} и закомментировать в ней (сам удивляюсь) границу в виде точек #ptb table td{padding:1px 5px; text-align: left; vertical-align: top; /*border: 1px dotted #424242;*/}
  14. Либо я вас не понял, либо вы меня. На ваш коммит я и ориентировался и в точности все изменения перенес к себе в движок, но беда в том, как мне кажется, что у вас там версия 1.5.5.1, а у меня 1.5.2.1. PS Нашел ошибку в запросе у себя, сказывается общая раскуроченность движка :-) Вроде теперь все окей работает
  15. Умел бы - прикрутил :-) Если у вас есть идеи, пишите - сразу добавлю в дополнение
  16. Итак, снова перемерял с изменениями из статьи toporchillo, получилось намного интереснее: До изменений Cache off: 7.22501 s 7.95 mb logs (2) sql (114) files (95) request (95) Cache on: 3.48739 s 7.95 mb logs (2) sql (73) files (95) request (95) После изменений Cache off: 3.62278 s 7.98 mb logs (2) sql (103) files (95) request (95) Cache on: 1.65011 s 7.98 mb logs (2) sql (62) files (95) request (95) То есть выигрыш по скорости в 2 раза, что очень круто! И я так думаю, что было бы еще лучше, если бы у меня была не 1.5.2.1, а 1.5.5.1, потому что есть пара моментов с несовместимостью. Буду благодарен, если кто-то укажет на причины ошибок: 1) Notice: Error: Unknown column 'p.rating' in 'field list' Возникает из-за того, что в самом первом оптимизированном запросе $query = $this->db->query("SELECT DISTINCT *, p.rating, pd.name AS name, p.image, m.name AS manufacturer, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, p.rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id IN ('" . implode("','", array_keys($product_data)) . "')");нет столбца rating (кмк, проблема в 1.5.2.1), как я это обошел - заменил в запросе в 2-х местах p.rating на (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS ratingв итоге длина запроса увеличилась, но рейтинг стал учитываться (если можно проще это сделать, укажите плиз). 2) Undefined index: discount in Z:\home\localhost\ocstore\catalog\model\catalog\product.php в 51-й строке: $row['price'] = ($row['discount'] ? $row['discount'] : $row['price']);я это просто закомментил, так как в магазине discounts вообще не используются. 3) И внезапно Notice: Undefined index: special in Z:\home\localhost\mstore\catalog\controller\product\category.php в 196-й и 203-й строках if ((float)$result['special']) { $special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax'))); } else { $special = false; } if ($this->config->get('config_tax')) { $tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price']); } else { $tax = false; }Здесь я вообще не понял что случилось и ничего не смог придумать, потому что акционная цена special все равно показывается
  17. А как новую версию то поставить? У меня нет строчки $row = array() в \system\database\mysql.php, соответственно пункт 3 установки выполнить не получается. Добавляю после $data = array(); и вроде что-то работает, но выпадают ошибки на неизвестную переменную sysstart, хотя сами запросы выводятся (но окно с их выводом после разворачивания намертво вешает браузер, а прокрутка лога требует пару минут Версия ОС 1.5.2.1, но такой строки нет и в 1.5.5.1, и в 1.5.1.3 - специально проверил
  18. Можно добавить таймаут на закрытие окна, но если его делать слишком маленьким, то клиент не успеет прочитать что написано в окне, а если слишком большим - никто не будет ждать окончания отсчета, всегда найдутся изобретательные идиоты, которые откроют окно еще несколько раз и наклацают вам еще одну пачку писем :-) Для всех версий старше 1.5.1.3 добавить после: <a onclick="$(window).colorbox.close();">Закрыть</a> это окно?</span>'); такой кусок setTimeout(function () { $(window).colorbox.close() }, 3000); Для 1.5.1.3 после: <a onclick="parent.$.fancybox.close();">Закрыть</a> это окно?</span>'); такой кусок setTimeout(function () { parent.$.fancybox.close() }, 3000); Ну и можете дописать в форме что-то типа Это окно автоматически закроется через 3 сек. P.S. У меня за полтора года использования такого дополнения никто не отправлял больше 2-х писем сразу, обычно все понимают, когда в форме написано Ваш заказ отправлен
  19. А зачем посетителю так кувыркаться с непонятной системой, если он может просто позвонить и сделать заказ по телефону (ну для особых жмотов или социопатов есть обратный звонок/скайп/имейл в конце концов)? P.S. Только зайдя к ним на сайт, понял суть этой системы. ИМХО здесь проблема даже еще глубже - попробуй объясни покупателю, что это за 4 цифры и зачем ему их куда-то называть? :-)
  20. Например так: SELECT DISTINCT m.`manufacturer_id`, m.`name` FROM `manufacturer` m LEFT JOIN product p ON(p.manufacturer_id=m.`manufacturer_id`) LEFT JOIN product_to_category p2c ON(p.product_id=p2c.product_id) LEFT JOIN product_to_store p2s ON(p.product_id=p2s.product_id) WHERE p.status = '1' AND p.date_availa или вот еще SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '8' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < '2013-03-12 23:59:59') AND (pd2.date_end = ' явно же запросы не полные или посмотрите мое сообщение выше со скриншотом медленных запросов - там тоже обрезано на полуслове местами
  21. 1. Наверное да, но тогда ведь теряется совместимость с версиями (хотя мне уже не страшно :-)) 2. Да, это функция getAttributesByCategoryId так резвится Скорее всего из-за кол-ва товаров в категории (4К), потому что самих уникальных атрибутов там 10 шт во всего 1-й группе. P.S. Скоро попробую изменения с вашей статьи снова прикрутить к движку, и перемерять результаты, а то старый дебаггер оказывается врал, а вот новый вроде ничего P.P.S. Подумал, что о совместимости в теме про оптимизацию вообще нет смысла говорить - либо оптимизируем, либо радуемся новым обновлениям НЕоптимизированного медленного движка :-)
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.