@ivanpolyakov,
В robots.txt Crawl-delay: 100
Ris
+657
Репутация
3771
Рейтинг
Продолжение мерлезонского балета.
Сегодня на яндексе проснулся какой-то злой дух и начал сканировать комментарии семилетней давности. И всё, сайт лёг.
В логе долгих запросов 100500 записей типа:
Полез в список комментариев, а там на последних страницах выборка по минуте:
Сразу стало всё гораздо веселее:
но пропали списки комментариев у пользователя в профиле.
Сил экспериментировать больше не было и поэтому ограничил нововведение списком всех комментариев:
Костыль, конечно, но вроде работает:
Сегодня на яндексе проснулся какой-то злой дух и начал сканировать комментарии семилетней давности. И всё, сайт лёг.
В логе долгих запросов 100500 записей типа:
# Query_time: 51.697987 Lock_time: 0.000473 Rows_sent: 20 Rows_examined: 1843896 SET TIMESTAMP=1520069949; SELECT i.*, r.score AS is_rated, u.nickname AS user_nickname, u.avatar AS user_avatar FROM cms_comments i LEFT JOIN cms_users AS u ON u.id = i.user_id LEFT JOIN cms_comments_rating AS r ON r.comment_id = i.id AND r.user_id='0' WHERE (i.is_private = '0') AND (i.is_deleted IS NULL) AND (i.is_approved = '1') ORDER BY i.date_pub DESC LIMIT 922000, 20;
Ничего умнее не придумал, как доработать \system\controllers\comments\frontend.php, по этой инструкции habrahabr.ru/post/217521/ таким образом:
// Получаем количество и список записей $this->model->limit($perpage)->join .= ("JOIN (SELECT id FROM cms_comments ORDER BY id DESC LIMIT ".($page-1)*$perpage.", $perpage ) c ON c.id = i.id "); $items = $this->model->getComments();
/system\controllers\comments\model.php => 296 => modelComments->getComments() SELECT i.*, r.score AS is_rated, u.nickname AS user_nickname, u.avatar AS user_avatar FROM cms_comments i JOIN (SELECT id FROM cms_comments ORDER BY id DESC LIMIT 958740, 20 ) c ON c.id = i.id LEFT JOIN cms_users AS u ON u.id = i.user_id LEFT JOIN cms_comments_rating AS r ON r.comment_id = i.id AND r.user_id='86' WHERE (i.is_deleted IS NULL) AND (i.is_approved = '1') ORDER BY i.date_pub DESC LIMIT 20 Время выполнения 0.22628 секунд
Сил экспериментировать больше не было и поэтому ограничил нововведение списком всех комментариев:
// Получаем количество и список записей $items = $this->model->getComments();
Может кто может подсказать более человеческий способ борьбы с limit offset на больших таблицах?
Jestik,
Или лучше на главной странице выводить комментарии из всех типов контента?
Тогда так:
Или лучше на главной странице выводить комментарии из всех типов контента?
Тогда так:
<?php class onContentCommentsListWidgetFilter extends cmsAction { public function run($model){ /*Если не главная страница*/ if ($_SERVER['REQUEST_URI'] != '/'){ /* Получаем все типы контента*/ /* Получаем текущий тип контента */ /* Если тип контента опознан - фильтруем комментарии только из него */ } // Отправляем данные обратно в компонент return $model; } }
Это я так… теорию излагаю. В реальности от этого HTTP_REFERER толку мало.Если это не сложно покажи на пальцах как это сделать? я не гуру в этом.
Ведь человек не сразу после входа на сайт бросается регистрироваться, а регистрировать все адреса, откуда какие гости приходят — база распухнет и лопнет.
В общем если нужно посмотреть, откуда приходят люди на сайт, есть замечательный инструмент у яндекса:
metrika.yandex.ru
Там нужно зарегистрировать свой сайт и тогда можно будет посмотреть, что за люди приходят, откуда, возраст, пол, размер бюстгальтера…
Вот это в хуки контента:Та нужный это функционал. Я бы не отказался
<?php class onContentCommentsListWidgetFilter extends cmsAction { public function run($model){ preg_match('/('.$ctypes.')/', $_SERVER['REQUEST_URI'], $matches); /* Получаем текущий тип контента */ $model->filterEqual('target_subject', $matches ? $matches[0] : str_replace('content:', '', $this->cms_config->frontpage)); // Отправляем данные обратно в компонент return $model; } }
@gopik,
Да ладно!
getenv("HTTP_REFERER") — выдает адрес с которого пришел на страницу юзер, который эту страницу просматривает. То есть он покажет Вам, откуда Вы пришли на страницу.
Осталось это только куда-нибудь сохранить (в базу данных) и потом оттуда доставать и показывать, где нужно.
Да ладно!
getenv("HTTP_REFERER") — выдает адрес с которого пришел на страницу юзер, который эту страницу просматривает. То есть он покажет Вам, откуда Вы пришли на страницу.

Осталось это только куда-нибудь сохранить (в базу данных) и потом оттуда доставать и показывать, где нужно.
GWK,
Нашел тут что-то этакое:
www.internet-technologies.ru/articles/kak-uznat-otkuda-prishli-posetiteli.html
Нашел тут что-то этакое:
www.internet-technologies.ru/articles/kak-uznat-otkuda-prishli-posetiteli.html
Ну а кто знал, что там перед этим?Да сработало но перед этим стояло это $this->filterEqual('tournament_id', $tournament_id); но теперь он не работает.

Тогда так:
$this->filterStart()->filterEqual('team_one, $id)->filterOr()->filterEqual('team_two, $id)->filterEnd();
Вы собираетесь все время находиться на сайте в одиночестве? Или все же предполагается, что будут еще пользователи, которые по ссылкам на комментарии в виджете будут переходить на другие страницы сайта?Например я в новостях, и справа виджет комментарии, зачем мне там видеть комментарии со всего сайта, я хочу видеть комментарии именно с этого.
Но это лирическое отступление.
Я правильно понял, что на странице какого-либо типа контента в виджете должны быть комментарии только из этого типа контента?
Тогда можно сделать хук comments_list_widget_filter, который будет отфильтровывать комментарии в виджете только из этого типа контента.
@Random,
Зажмите CTRL и крутите колесо мыши.
Зажмите CTRL и крутите колесо мыши.
@infiniti,
А другие виджеты, где будут комментарии из других типов контента тоже нужны? Или выводить только из одного типа?
А другие виджеты, где будут комментарии из других типов контента тоже нужны? Или выводить только из одного типа?
ParadoX,
Ищите ответ в логах ошибок на сервере.
Ищите ответ в логах ошибок на сервере.
$this->filterEqual('team_one, $id)->filterOr()->filterEqual('team_two, $id);