Jump to content

Recommended Posts

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

Заодно, если найдутся знающие люди, буду рад, если раскритикуют и предложал лучше.

Код не мой, нашел на гитхабе после инцидента с превышением квоты процессорной работы у хостера. Человек использует в продакшене.

Собственно, запросив лог медленных запросов за 4 часа у хостера, обнаружил узкое горлышко:

Цитата

# Profile
# Rank Query ID           Response time  Calls R/Call V/M   Item
# ==== ================== ============== ===== ====== ===== ==============
#    1 0x2B7932AFEE815737 118.9284 76.5%  1087 0.1094  0.07 SELECT oc_category_path oc_product_to_category oc_product oc_product_description oc_product_to_store
#    2 0xCAC7941701616847   9.4839  6.1%    94 0.1009  0.00 SELECT oc_seo_url
#    3 0xDE667724A1472B8E   7.9299  5.1%    51 0.1555  0.28 SELECT oc_review oc_product_discount oc_product_special oc_product oc_product_description oc_product_to_store
#    4 0xC147C0DB8F6F746A   3.5260  2.3%    35 0.1007  0.00 SELECT oc_product_discount oc_product_special oc_product_reward oc_stock_status oc_weight_class_description oc_length_class_description oc_review oc_product oc_product_description oc_product_to_store oc_manufacturer
#    5 0xB1D3084A5DB560C3   1.6027  1.0%     7 0.2290  0.43 SELECT oc_product oc_product_description
#    6 0xF75E926F33E20E3D   1.3082  0.8%    13 0.1006  0.00 SELECT oc_product_attribute oc_attribute oc_attribute_description
#    7 0x270EA830AC8D7EE7   1.1103  0.7%    11 0.1009  0.00 SELECT oc_category oc_category_description oc_category_to_store
#    8 0x2AD6CC66AE9FE12C   1.0053  0.6%    10 0.1005  0.00 SELECT oc_review oc_product_discount oc_product_special oc_product_to_category oc_product oc_product_description oc_product_to_store
#    9 0x27E53545A394E066   0.9096  0.6%     9 0.1011  0.00 SELECT oc_theme
#   10 0x51A9CCA928B1D4F1   0.9079  0.6%     9 0.1009  0.00 SELECT oc_product_attribute oc_attribute oc_attribute_group oc_attribute_group_description
#   11 0xBEB5454CE18270B7   0.8038  0.5%     8 0.1005  0.00 SELECT oc_setting
#   12 0xC299D08C9A944789   0.7034  0.5%     7 0.1005  0.00 DELETE oc_cart
# MISC 0xMISC               7.3385  4.7%    73 0.1005   0.0 <40 ITEMS>

 

Суть работ:

Цитата

Anyway, here is example of the solution we are currently using...

File: /catalog/model/catalog/product.php
Function: getTotalProducts
At the end of the function replace:


$query = $this->db->query($sql);
return $query->row['total'];

With:


$sql_name = md5($sql);

$final_total = $this->cache->get('product.count.' . $sql_name);
if(!$final_total){
    $query = $this->db->query($sql);
    $final_total = $query->row['total'];
    $this->cache->set('product.count.' . $sql_name, $final_total);
}

return $final_total;

 

Реплейсим исходники и спустя сутки наблюдаем такую картину:

 

Спойлер

image.png.f54367431d208074f682c4b52284ea46.png

Малым количеством телодвижений можно добиться хороших результатов.

Кэш обновляется после изменения в структуре БД. Багов пока не наблюдаю.

В большинстве своем, это поможет тем, у кого в продакшене 1000+ товаров.

Был краток.

Я всё.

 

  • +1 3

Share this post


Link to post
Share on other sites

Ах да, время первого ответа приложения сократилось примерно в 2.5 раза.

Спойлер

image.png.2beb4ed0e9a8d83169be1346ef3e28cd.png

 

Share this post


Link to post
Share on other sites

Постою, послушаю.

Share this post


Link to post
Share on other sites

Добрый день, а можно подробнее описать что нужно сделать? а то не понял ничего

Share this post


Link to post
Share on other sites

и для версии 2,2 и 2,3 так же нужно будет делать?

Share this post


Link to post
Share on other sites

да ладно вам - человек нашел, поделился

а не стал ныть "моя нуб, ничего не знаю, памагите!"

 

все с малого начинают

  • +1 1

Share this post


Link to post
Share on other sites
3 минуты назад, AlexDW сказал:

да ладно вам - человек нашел, поделился

а не стал ныть "моя нуб, ничего не знаю, памагите!"

 

все с малого начинают

так правильно человек написал или есть другие варианты? более верные?

Share this post


Link to post
Share on other sites
17 минут назад, toporchillo сказал:

[:||||||||||||||||||:]

Очень интересно, продолжай.

25 минут назад, dimetrio1986 сказал:

Добрый день, а можно подробнее описать что нужно сделать? а то не понял ничего

Добрый.

В  /catalog/model/catalog/product.php
Заменить

$query = $this->db->query($sql); 
return $query->row['total'];
На
$sql_name = md5($sql); 
$final_total = $this->cache->get('product.count.' . $sql_name); 
if(!$final_total){ 
$query = $this->db->query($sql); 
$final_total = $query->row['total']; 
$this->cache->set('product.count.' . $sql_name, $final_total); 
} 
return $final_total;

 

  • +1 1

Share this post


Link to post
Share on other sites
20 минут назад, SiSya сказал:

Очень интересно, продолжай.

Добрый.

В  /catalog/model/catalog/product.php
Заменить


$query = $this->db->query($sql); 
return $query->row['total'];

На

$sql_name = md5($sql); 
$final_total = $this->cache->get('product.count.' . $sql_name); 
if(!$final_total){ 
$query = $this->db->query($sql); 
$final_total = $query->row['total']; 
$this->cache->set('product.count.' . $sql_name, $final_total); 
} 
return $final_total;

 

спасибо!

Share this post


Link to post
Share on other sites

шота я в "узком горлышке" не вижу кешеруемый запрос.

а так то да, оптимизация начального уровня.

гуд, но хочется надеяться что это подтолкнет засесть за книжки.

Share this post


Link to post
Share on other sites

1. SQL УЖЕ кэширует запросы, если убрать из них NOW(), и кэширует лучше.

2. 100500 файлов в папке кэша все поставят колом.

Share this post


Link to post
Share on other sites
17 минут назад, toporchillo сказал:

1. SQL УЖЕ кэширует запросы, если убрать из них NOW(), и кэширует лучше.

2. 100500 файлов в папке кэша все поставят колом. 


А если вместо папки кеша используется memcached?

Share this post


Link to post
Share on other sites
19 минут назад, toporchillo сказал:

100500 файлов в папке кэша все поставят колом

так файловую подсистему тоже не пальцем делали. там тоже все хорошо кэшируется.

главное шоп памяти хватило под все эти непотребности

  • +1 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.