Многие участники коммьюнити знают, что я занимаюсь нагруженными проектами и собаку съел на поиске узких бутылочных горлышек. И opencartforum в том числе работает благодаря моему участию, так что поводов усомниться в моих высказываниях, особо не должно ни у кого возникнуть!
Почему именно проектами а не проблемами движка opencart, потому что в самом движке все понятно и просто, а в проектах бывает все очень весело.
90% тормозов магазинов связано с разработчиками и слабой экспертизой разработчиков и программистов.
Почему то в определенных узких кругах считается моветоном обсуждать косяки друг друга,и не дай боже сказать, Вася, ты дурак, ты своротил полный бред!
Мне всю жизнь было побоку на чье-то субъективное мнение, и истина мне дороже чем чье-то псевдопозитивное отношение, поэтому в этих "узких кружках" разработчиков регулярно бомбит в мою сторону, когда кого-то из них мы выводим на чистую воду, но как говорили в КВН нас "много".
Просто приведу вам пример из последних двух инцидентов с которыми мне пришлось столкнуться:
История первая.
Магазин на 10 000 товаров, все от души заполнено, все атрибуты, опциии, описания, все хорошо.
Стоит фильтр от госоподина @SooR, который в целом в свежих версиях в том числе и моими молитвами, достаточно быстро работает, но нет!
4 секунду генерация без сфомированных кешей на выделенном сервер с 16 ядрами и вагоном оперативной памяти.
Начинаем разбираться. У проекта есть собственный программист, который его ведет, и который там накопал такого...... что никуда не натянешь. От опенкарта осталось только названия. На вопрос зачем - ответ. Ну мне так надо было.
На вопрос дружище. А как же там все патчи безопасности, обновления функционала, стабильные версии дополнений, в ответ текст - ты ваще кто здесь, чтобы мне что-то расказывать.
ок ок. дружище, мое дело маленькое, найти причину тормозов.
Путем нехитрых манипуляций обнаруживаем очень смешной код:
$q = "SELECT slide_value_min,
slide_value_max,
option_id
FROM " . DB_PREFIX . "ocfilter_option_value_to_product
WHERE option_id IN (" . implode(',', $slider_options_id) . ") AND slide_value_min > '0'";
$query = $this->db->query($q);
if ($query->num_rows) {
$slide_data = array();
foreach ($query->rows as $row) {
$slide_data[$row['option_id']]['min'][] = $row['slide_value_min'];
$slide_data[$row['option_id']]['max'][] = $row['slide_value_max'];
}
foreach ($query->rows as $row) {
$options_data[$row['option_id']]['slide_value_min'] = preg_replace('!(0+?$)|(\.0+?$)!', '', min($slide_data[$row['option_id']]['min']));
$options_data[$row['option_id']]['slide_value_max'] = preg_replace('!(0+?$)|(\.0+?$)!', '', max(array_merge($slide_data[$row['option_id']]['max'], $slide_data[$row['option_id']]['min'])));
}
}
Это полный фак фак мазафак, вместо того чтобы использовать всю реляционную мощь mysql, это существо, перебирает и мерджит и сравнивает вагон массивов.
Конкретно в нашем случае у нас было 4000 значений из базы, на каждое из которых работало вот это
preg_replace('!(0+?$)|(\.0+?$)!', '', max(array_merge($slide_data[$row['option_id']]['max'], $slide_data[$row['option_id']]['min'])));
4000 итерация регулярки + объединения массива + нахождение max значения. Это даже не индусский код - это ДНО...
Сидит человек на зарплате, пилит проект, накрутил его так , что кроме него там никто не разберется, чтобы не дай бог его не уволили, и пишет ДНОООООООО!!!!
Это не код, это 80 левел ДНА. Пятиклассники на информатике такого не делают.
Ок, исправляем, немного костыльно, быстро, за красоту не платят, делаем так:
$q = "SELECT MIN(slide_value_min) as slide_value_min, MAX(slide_value_min) as max_slide_value_min, MAX(slide_value_max) as slide_value_max, MIN(slide_value_max) as min_slide_value_max, option_id FROM " . DB_PREFIX . "ocfilter_option_value_to_product WHERE option_id IN (" . implode(',', $slider_options_id) . ") AND slide_value_min > '0' GROUP BY option_id"; $query = $this->db->query($q); if ($query->num_rows) { $slide_data = array(); foreach ($query->rows as $row) { $options_data[$row['option_id']]['slide_value_min'] = (int)$row['slide_value_min']; if($row['max_slide_value_min'] > $row['slide_value_max']) { $options_data[$row['option_id']]['slide_value_max'] = (int)$row['max_slide_value_min']; } else { $options_data[$row['option_id']]['slide_value_max'] = (int)$row['slide_value_max']; } }
Просто одним запросом получаем и min и max и это не 4 секунды, а где-то 50-70 мс..
Все работает. В ответ слышим.. Ну ты решил затык с тормозами, спасибо. Дальше мы сами разеберемся. Увещевания о том, что дядя, там же патчи безопасности, обновления алгоритмов, верни все в базу.. Бесполезно!!
Я еще и плохой оказался, так как намекнул владельцам, что вас дрючат и парень вас на себя завязал надолго и всеръез!
Все таки надо совесть иметь и думать что, тебя собъет машина, а кто-то должен после тебя твой код починить.
Вот это понимание отсутсвует у 99% напрочь.
Второй кейс.
Приходит человек с жалобами тупит поиск, ок ставим ему sphinx, и получаем все равно те же 4 секунды ответа...
Идеально быстрый магазин. Главная страница без глобального кеша 130мс, страница категорий 300-400мс, поиск 4000.
Медленных запросов - нет! Выборка из сфинкса - порядка 20-30мс.
Но тупит.... Ок ок.. Начинаем копать и видим странное дно...
SEO CMS PAGES ver.1.1
Отключаем... И вииииииииииииииууууу... 350 мс генерация страницы..
Я ни в коем случае не буду писать автору, и гооврить что у него там проблемы, ему писано переписано и про его дыры и про его ночной код. У него звезда во лбу и это бесполезно,
Я просто удалю эту чушь! И мы получим ооооооооооооочень быстрый магазин.
И эти люди еще лезут в оптимизацию и ускорению, делают какие-то модули для оптимизации, когда другие их наработки делают +4 секунды на голом месте.
Серьезно?
Морали никакой. - Просто если у вас тупит поиск - отключайте это дно а лушче вообще не пользоваться разработками этого автора.
ЭТО МОЕ ЛИЧНОЕ МНЕНИЕ
Но очень много частных случаев с модулями этого автора. А на площадке это все как продавалось так и продается.
Уважаемая администрация, вам не стыдно, что у вас в каталоге дополнений продается откровенный шлак а вы закрываете на это глаза? Это же не первый не второй раз?
Сколько можно класть на пользователей дополнений?
Ваше мнение уважаемая администрация, может не совпадать с моим, но у меня есть пруфы, если вдруг у вас возникнут сомнения в правдивости моих тезисов!