Показаны сообщения с ярлыком optimization. Показать все сообщения
Показаны сообщения с ярлыком optimization. Показать все сообщения

7 марта 2015 г.

Очередная тема, которая призвана напомнить, что большую часть денежных средств за хостинг мы тратим на роботов. Если с поисковыми системами можно как-то договориться, то с разного рода сканерами и парсерами приходится вести борьбу.

Дабы не повторять озвученные ранее тезисы, связанные с производительностью и экономией, отмечу лишь то, что всё что нужно роботам - это полезная информация, которая в большей степени представляет собой обычный текст. Всё остальное рассчитано на пользовательский интерфейс, на взаимодействие с человеком. Речь конечно идёт о сторонних модулях, которые расширяют функционал магазина в ущерб производительности сайта.

4 мая 2014 г.

Начнём с небольшого экскурса на тему для чего нужен свод правил для поисковых роботов в виде файла robots.txt.

Как известно, в этом текстовом файле описываются разделы, страницы или файлы сайта, которые должны быть проиндексированы или проигнорированы роботами поисковых систем (ПС). Кроме того, там могут быть описаны условия поведения роботов на сайте, такие как частота сканирования или параметры сканирования. Более подробную информацию можно получить на одноименном ресурсе по адресу http://robotstxt.org.ru.

13 марта 2013 г.

SEO URL важная функциональная часть в программном обеспечении OpenCart, объяснять её востребованность нет смысла, достаточно вспомнить технологии SEO. Режим SEO-ссылок включается в панели администрирования в настройках магазина (закладка Сервер).

Вроде всё понятно, но есть одна проблема - это существенная нагрузка на базу данных! Это, пожалуй, самая затратная часть в плане расхода вычислительных ресурсов сервера. С ростом количества товаров и посетителей замедление в работе магазина становится настоящей проблемой! Можно, конечно, выбрать оборудование получше, но если вы собираетесь серьёзно заниматься онлайн-коммерцией, то в какой-то момент времени посмотрите на счета за услуги хостинга и удивитесь сумме ежемесячных платежей. Именно решением этой проблемы мы и занимаемся.

3 марта 2013 г.


По умолчанию в OpenCart доступна сортировка четырёх видов: по умолчанию (по порядку), по наименованию продукта, по цене и по наименованию модели.

Сортировка продуктов (программно) выполняется путём выполнения сформированного SQL-запроса в модели ./catalog/model/catalog/product.php в функциях getProducts и getProductSpecials.

Избыточность сортировки заключается в том, что при выборе сортировки по наименованию, сортировка в запросе получится следующая: ORDER BY LCASE(pd.name) ASC, LCASE(pd.name) ASC.

Чтобы исключить дополнительную, пусть и незначительную, нагрузку на базу, часть кода в перечисленных выше функциях
...
if (isset($data['order']) && ($data['order'] == 'DESC')) {
   $sql .= " DESC, LCASE(pd.name) DESC";
} else {
   $sql .= " ASC, LCASE(pd.name) ASC";
}
...

необходимо заменить на

if (isset($data['order']) && ($data['order'] == 'DESC')) {
   $sql .= " DESC";
   if (isset($data['sort']) && $data['sort'] != 'pd.name') $sql .= ", LCASE(pd.name) DESC";
} else {
   $sql .= " ASC";
   if (isset($data['sort']) && $data['sort'] != 'pd.name') $sql .= ", LCASE(pd.name) ASC";
}

Хотелось бы отметить тот факт, что такие мелочи в купе дают значительную нагрузку на сервер и в конечном итоге успешный продукт становится тяжёлым и неповоротливым.

Программное обеспечение CS-Cart как наглядный пример неоптимизированного продолжения OpenCart.

24 февраля 2013 г.

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

В перечисленных ниже файлах вычисляются количество продуктов для каждой категории. Количество будет показано только в том случае, если включена соответствующая опция config_product_count в панели администрирования магазином.

./catalog/controller/module/category.php
./catalog/controller/product/category.php
./catalog/controller/common/header.php

Однако несмотря на саму возможность отключения показа количества продуктов в меню категорий, нагрузка остаётся и проблема в условии их показа:

$product_total = $this->model_catalog_product->getTotalProducts($data);
...
'name'  => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
...

Очевидно обращение к модели не имеет смысла, если показ отключён. Более верным решением будут следующие строчки кода:

$product_total = '';
...

if ($this->config->get('config_product_count')) {
$product_total = $this->model_catalog_product->getTotalProducts($data);
$product_total = ' (' . $product_total . ')';
}

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

23 февраля 2013 г.

Использование кэша в OpenCart позволяет сократить количество обращений к базе данных и увеличить быстродействие магазина, однако есть некоторые нюансы в работе самого кэша.

Управление кэшем происходит в файле ./system/library/cache.php, если обратить внимание на функцию get, то видно, что результат возвращается функцией php unserialize когда файл кэша есть и null, когда его нет. Это значит, что если в кэше сохранён результат пустой выборки в одной из моделей, то при очередном запросе кэша будет возвращён ноль.

Практически во всех моделях условие проверки кэша следующее:

$product_data = $this->cache->get( ...

if (!$product_data) { ...

что в корне неверно, так как содержание кэша, например, строка s:1:"0";, может сообщить модулю об его "отсутствии" и будет выполнено повторное обращение к базе.

Если создать новые категории, то это будет хорошо заметно. Товаров нет, каждый раз запрос из базы возвращает пустой результат и сохраняет его в кэше. В этом конкретном примере необходимо открыть файл ./catalog/model/catalog/product.php найти функцию getTotalProducts и в её теле заменить условие

if (!$product_data) { ...

на

if ($product_data === null) { ...

Теперь существование кэша будет правильно воспринято отдельно взятой функцией того или иного модуля. Исправления актуальны для всех версий OpenCart, включая последнюю v1.5.5.1.

Update

Работая с библиотекой кэша ./system/library/cache.php обратил внимание, что принцип выдачи кэшированной информации организован неверно. Модулю, запросившему кэш, может быть выдана устаревшая информация, если обратите внимание на код, то данные с файла считываются раньше проверки на время.

Дабы не создавать отдельную статью, приведу решение здесь. Функцию get() необходимо заменить на код ниже.

public function get($key) {
$data = null;
$files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
if ($files) {
for ($n=0, $lenght = count($files); $n < $lenght; $n++) {
$file = $files[$n];
$time = substr(strrchr($file, '.'), 1);
      if ($time < time()) {
if (file_exists($file)) { unlink($file); } 
      } elseif (!$n) { $cache = file_get_contents($file); $data = unserialize($cache);
} } }  return $data; }

Кстати, обновлённная функция работает немного быстрее, т.к. используется цикл for next (призываю использовать в PHP вместо foreach везде) и unserialize выполняется не по умолчанию, а только если кэш не устарел.

Если у Вас недостаточно опыта по внесению изменений в программный код OpenCart, то мы готовы предложить со своей стороны помощь.
  • RSS
  • Twitter
  • Youtube