Отображение кол-ва товаров в категории

Тема в разделе "OpenCart", создана пользователем Veles, 30 сен 2013.

?

Что является стимулом посещения данного форума?

  1. Раздел платные модули бесплатно!

    87,5%
  2. Отзывчивое и всесторонне развитое сообщество.

    62,5%
  3. GIF анимация с сиськами в чате на главной.

    37,5%
  4. Испытываю радость когда помогаю кому-либо.

    37,5%
Можно выбрать сразу несколько вариантов.
  1. Veles

    Veles

    Регистрация:
    27 янв 2013
    Сообщения:
    212
    Симпатии:
    141
    Ещё с месяц назад сталкивался с проблемой тормозов при включённом чекбоксе опции "Отображение кол-ва товаров в категории" для меню, в магазине 30 000 товаров и было дело смирился с проблемой.

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

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

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Кеширование.
    Тормоза есть только при обращении к БД. В случае стандартного кеширования ОпенКарта, кеш живёт один час. Можно увеличить время жизни стандартного кеша или использовать дополнительные средства, например, memcached.
     
  3. Veles

    Veles

    Регистрация:
    27 янв 2013
    Сообщения:
    212
    Симпатии:
    141
    Меня никакое кэширование не спасало, на какую страницу не зайди всё одно - по 3 минуты грузились. Мемкашед на сколько помнится то же имеет недостатки и периодически вешает магазин, да и поставить его можно только на выделенный или виртуальный сервер, хотя на форуме есть "хвастуны" с ехидной улыбкой заявляющие, что способны решить эту проблему за скромное или не очень вознаграждение. Вот и интересно на сколько обоснованы подобные заявления..
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Иногда он встречается и на шаред хостингах. А магазин на 250 тысяч товаров на шареде стоять не может в любом случае.

    Стоит начать с того, что php имеет недостатки:Smile: Всё зависит от прямоты рук.

    Не всё попадает в кеш в ОпенКарте. Количество товаров в категории как раз в стандартном варианте не кешируется.
     
  5. Bogdan

    Bogdan

    Регистрация:
    25 фев 2013
    Сообщения:
    228
    Симпатии:
    104
    Так тогда можно просто в методе getTotalProducts кешировать данное действо, хотя ... в этом случае кеш создаст 250 000 файлов ...
     
  6. Veles

    Veles

    Регистрация:
    27 янв 2013
    Сообщения:
    212
    Симпатии:
    141
    То есть можно сделать их кэшируемыми? По поводу рук у всех они сначала кривые, все начинают с нуля, потому и советы типа: "пусть делают профессионалы", итак очевидны и потому раздражительны.
    Кстати, на что влияет подобное вмешательство в код:
    --- Добавлено, 1 окт 2013 ---
    А так же может кто-нибудь прокомментировать актуальность следующих действий по оптимизации БД:
     
    Последнее редактирование: 1 окт 2013
  7. Bogdan

    Bogdan

    Регистрация:
    25 фев 2013
    Сообщения:
    228
    Симпатии:
    104
    Гоню .... Это ж товаров 250000, а категорий-то намного меньше.

    Ну можно вообще сделать, как говорили ранее (похоже пост зачем-то удалили) - добавить в таблицу categories столбец count (например), в модели products задать изменение столбца count из таблицы categories при добавлении/удалении товара. А в модели категорий в начале метода getTptalProducts поставить проверку, если есть столбец count то тупо берем инфу из него, если нет, тогда считаем

    А еще лучше: в модели категории к выборке добавляем этот столбец, если он есть, а потом в контроллере при получении ответа смотрим если в ответе этот столбец, если есть то сразу берем, если нет - тогда вызываем getTotalProducts. Так вообще лишних запросов к базе не будет - должно работать с той же скоростью как и при выключенном подсчете
     
    Последнее редактирование: 1 окт 2013
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Не создаст. Результат запроса к БД - это один файл. Файлов будет по количеству категорий (на каждую по запросу).

    А что находиться внутри файлов cache_start.php и cache_end.php?


    Индексы ускоряют выборку избавляя от необходимости читать таблицу целиком (индексы хранятся отдельно). Но ускоряют они выборку только, если значения более-менее уникальны. То есть, индекс по id товара ускорит выборку, а индекс по статусу, наоборот, замедлит. И есть смысл индексы по полям, которые часто используются вместе делать дополнительно комбинированными (MySQL сам решит по запросу использовать отдельный индекс или комбинированный).
     
  9. Bogdan

    Bogdan

    Регистрация:
    25 фев 2013
    Сообщения:
    228
    Симпатии:
    104
    Правильные индексы 100 пудов ускорят, а вот если добавить поле count (ну или по другому его обозвать), то это позволит сделать задержку на подсчет фактически нулевым (просто в запросе на имя, йади и т.д. категории добирать еще и это поле), что значительно лучше, чем просто ускорить
     
  10. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Этот вариант подходит только при добавлении товаров вручную.
    Кроме того, количество товаров в категории - это не общее количество, а количество включённых товаров. В случае мультимагазина оно ещё завист и от привязки товара к конкретному магазину (категории то могут совпадать).
     
  11. Bogdan

    Bogdan

    Регистрация:
    25 фев 2013
    Сообщения:
    228
    Симпатии:
    104
    Согласен - немножко дыряво.
    Но можно кроном пару (4-6-8) раз в сутки актуализировать цифры через стандартный getTotalProducts
    Ну а предложенные индексы - во-первых безболезненный вариант в плане реализации и совместимости, во-вторых будет не лишним и при предложенном мною варианте.
    Так что индексам - да! :Smile: