Хак "Оптимизация вывода комментариев"

+49
2.93K
Добрый день!

Сегодня с утра решил заняться оптимизацией запросов и обнаружил такую штуку — при выводе комментариев делается N запросов к БД(по количеству комментов) на предмет оценки комментария текущим пользователем. То есть если в статье 30 комментариев — то делается 30 запросов, чтобы проверить оценивали вы его или нет, что не есть хорошо.

Данный хак (для версии инстанта 1.9) модифицирует запрос по получению комментариев и позволяет избавиться от ненужных N запросов.

Сразу скажу — не пугайтесь, что "много букав" — меняется всего 4 строки (две добавить и две изменить).
ВАЖНО: перед правкой обязательно сделайте копии файлов components/comments/model.php и components/comments/frontend.php


1. В файле components/comments/model.php находим строку
  1. public function getComments($target, $target_id, $cfg){
меняем на
  1. public function getComments($target, $target_id, $cfg,$user_id=0){
2. Далее в этой же функции меняем запрос с
  1.  
  2. $sql = "SELECT c.*,
  3. IFNULL(v.total_rating, 0) as votes,
  4. IFNULL(u.nickname, 0) as nickname,
  5. IFNULL(u.login, 0) as login,
  6. IFNULL(u.is_deleted, 0) as is_deleted,
  7. IFNULL(p.imageurl, 0) as imageurl,
  8. (NOW() < DATE_ADD(c.pubdate, INTERVAL {$cfg['edit_minutes']} MINUTE)) as is_editable
  9. FROM cms_comments c
  10. LEFT JOIN cms_ratings_total v ON v.item_id = c.id AND v.target = 'comment'
  11. LEFT JOIN cms_users u ON u.id = c.user_id
  12. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  13. WHERE c.target='$target' AND c.target_id=$target_id AND c.published=1
  14. ORDER BY c.pubdate ASC";
  15.  
  16.  
  17.  
На
  1.  
  2. $sql = "SELECT c.*,
  3. IFNULL(v.total_rating, 0) as votes,
  4. IFNULL(u.nickname, 0) as nickname,
  5. IFNULL(u.login, 0) as login,
  6. IFNULL(u.is_deleted, 0) as is_deleted,
  7. IFNULL(p.imageurl, 0) as imageurl,
  8. (NOW() < DATE_ADD(c.pubdate, INTERVAL {$cfg['edit_minutes']} MINUTE)) as is_editable
  9. ,(IF(r.id,1,0)) as is_voted
  10. FROM cms_comments c
  11. LEFT JOIN cms_ratings_total v ON v.item_id = c.id AND v.target = 'comment'
  12. LEFT JOIN cms_users u ON u.id = c.user_id
  13. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  14. LEFT JOIN cms_ratings r on ((r.item_id = c.id)and(r.target='comment')and(r.user_id = $user_id))
  15. WHERE c.target='$target' AND c.target_id=$target_id AND c.published=1
  16. ORDER BY c.pubdate ASC";
  17.  
В запрос добавится две строки
  1. ,r.id as is_voted
и
  1. LEFT JOIN cms_ratings r on ((r.item_id = c.id)and(r.target='comment')and(r.user_id = $user_id))
После этих правок запрос сразу вернет в поле is_voted "1" если посетитель голосовал за коммент и "0" если не голосовал.
3. В файле components/comments/frontend.php меняем строку
  1. $comments_list = $model->getComments($target, $target_id, $cfg);
на
  1. $comments_list = $model->getComments($target, $target_id, $cfg,$inUser->id);
4. и строку
  1. $comments[$next]['is_voted'] = ($comments[$next]['is_my'] || $inDB->rows_count('cms_ratings', 'item_id='.$comments[$next]['id'].' AND target=\'comment\' AND user_id='.$inUser->id, 1));
на
  1. $comments[$next]['is_voted'] = ($comments[$next]['is_my'] || $comments[$next]['is_voted']);
ВАЖНО: перед правкой обязательно сделайте копии файлов components/comments/model.php и components/comments/frontend.php
0
Def Def 12 лет назад #
в итоге сколько запросов получается?) один?)
0
SJen SJen 12 лет назад #
Ну если раньше было 1+N, то сейчас просто 1.
Экономия N запросов. Это актуально для тех, у кого много комментариев к статьям (я тоже отношусь к этой группе)
0
Def Def 12 лет назад #
а у меня только такая строка есть:

Код PHP:
  public function getComments($target, $target_id, $cfg, $club_wall_view=0, $page=1){
0
SJen SJen 12 лет назад #
эээ, версия какая инстанта?
0
Def Def 12 лет назад #
вроде 1.9
+2
Malstein Malstein 12 лет назад #
SJen а можно на ваш сайтик посмотреть?
+1
SJen SJen 12 лет назад #
в личку кинул
+1
Soul Soul 12 лет назад #
и я бы взглянул! Молодец! - пост за постом!+
+1
Soul Soul 12 лет назад #
+++!
0
mrDON mrDON 12 лет назад #
не перестаешь радовать, +санул.
0
NIKITA NIKITA 12 лет назад #
исчезли стили
my_projects\kristy.sytes.net\www\components\comments\frontend.php on line 156
обновил соmments на изначальный, нет результата
0
NIKITA NIKITA 12 лет назад #
Parse error: syntax error, unexpected T_FOREACH in \my_projects\kristy.sytes.net\www\components\comments\frontend.php on line 156
0
SJen SJen 12 лет назад #
Я так думаю, что стерли закрывающуюся скобку "}"
0
SJen SJen 12 лет назад #
что-то не так вставили:)
Там же синтаксическая ошибка высветилась.

Если есть желание установить хак, закиньте свой frontend.php - помогу поставить.
0
Роман Роман 12 лет назад #
+ за оптимизацию, это никогда не повредит.
на этом сайте часто вижу много полезных модификаций, и жалко, если их не будут включать в офф релиз

если можно скиньте сайт в личку :)
0
GarikKR GarikKR 12 лет назад #
Спасибо большое за полезности!А можно тоже взглянуть одним глазком..
0
picaboo picaboo 12 лет назад #
Отличное начинание! Главное не останавливаться - там есть еще где пооптимизировать
+1
ph3no ph3no 12 лет назад #
SJen отличное решение, спасибо!
Еще бы проблему помогли бы решить с подвисанием сайта, когда включен вывод гостевых комментариев.
0
SJen SJen 12 лет назад #
ну если конкретизируете проблемку, тогда возможно что подскажу.
пишите в личку, ну и сайт сразу кидайте.

Ну и вы хак этот поставьте, может проблема сама пропадет - нагрузка то реально снижается оооооочень сильно.
0
DimaGrr DimaGrr 12 лет назад #
Исправил, на 1.9 работает.
0
Coolmax Coolmax 12 лет назад #
Вот бы ещё и поправленные файлики сразу выложили :)
0
SJen SJen 12 лет назад #
поправленные файлики специально не выложил - у многих там уже измнений куча. И у меня кстати тоже - так что моя модификация файлов не нужна большинству.
0
veronika veronika 12 лет назад #
Подскажите в чем может быть проблема, после правки файлов пропадают комментарии т.е. пишется количество комментариев, но сами комментарии не выводятся, после замены исправленных файлов комментарии появляются.
0
SJen SJen 12 лет назад #
логично, что после возвращения файлов комментарии появляются)
Причина только в неправильной правке - что-то не туда вставили. Точнее нельзя сказать, не видя файлы.
0
veronika veronika 12 лет назад #
Тоже самое сделала на денвере, все работает?
0
SJen SJen 12 лет назад #
это вопрос?
у меня сайт одинаково ведет себя на денвере и на реальном сервере, у вас разве по-другому?)
Повторюсь, не видя файлы ничего более конкретно сказать нельзя - или очепятка или не туда копирнули что-то, это самая вероятная причина "неработы" на сервере.
0
veronika veronika 12 лет назад #
Скопировала файлы с сайта на денвере, результат тот-же, на сайте пропадают комментарии :(((
0
SJen SJen 12 лет назад #
кидайте файлы в архив, закидывайте на инстант в свои файлы и мне ссылочку в личку - посмотрю
по-другому ничего не решим)
0
Def Def 12 лет назад #
а как на 1.10 с этим дела обстоят?

Еще от автора

Обновление компонента "Мне нравится"
Приветствую. Закончил версию с исправлением ошибок и багов, всем пользователям обновление выслано на электронку.
Обновление компонента  "Каталог дополнений в админку"
Приветствую. Обновление самого популярного аддона из официального каталога дополнений.
Обновленный парсер Яндекс.Карт
Приветствую Изменения довольно значительны, поэтому имеет смысл оформить их отдельным постом.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.