Самый эффективный способ подсчета «популярности» объектов на сайте - PullRequest
3 голосов
/ 23 февраля 2011

Хорошо, поэтому я создаю сайт, на котором люди могут публиковать новости, комментарии, вопросы и т. Д. Люди также могут оценивать все эти объекты, добавлять их в избранное, делиться ими и т. Д. На сайте PHP + MySQL. Я написал скрипт на PHP, который делает следующее:

  1. Получите все комментарии и оценки, добавленные к ним за последние 5 минут. Добавьте запись в таблицу «популярность» с изменением популярности для каждого объекта комментария.
  2. Получите все новости и оценки / просмотры / избранное / акции добавлены к ним. Рассчитайте популярность для каждой новости (принимая во внимание изменение популярности комментариев, прикрепленных к ним на шаге 1) и вставьте запись в таблицу популярности с изменением популярности для каждого объекта новостей.
  3. Повторите шаг 2 для вопросов и других типов объектов

Я пытался запускать этот скрипт (на самом деле это задача Symfony) каждые 5 минут с помощью задания cron, и PHP начал задыхаться и поглощать все ресурсы моего сервера.

Каков предпочтительный способ запуска сценария фоновой аналитики, который вычисляет новые данные на основе данных в БД MySQL, а затем вставляет вычисленные данные в БД? Я уверен, что мне не хватает некоторых основных процедур здесь. Следует отметить, что БД находится на другом сервере, и у этого сервера не было проблем с ресурсами. Похоже, что проблема сводится к тому, что PHP блокирует сервер приложений, просматривая объекты, вычисляя популярность (простые вычисления) и вставляя в БД.

Спасибо

- Правка

Как насчет репликации БД на сервер, используемый только для расчетов. Я мог запустить скрипт популярности на сервере вычислений с реплицированной БД и вставить вычисленные записи популярности в живую БД. Конечно, это будет немного задержано, но это не так уж важно. Я не уверен, если это решит проблему потребления ресурсов PHP, хотя.

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

Ну, первое, что нужно сделать, это попытаться уменьшить количество выполняемых вами запросов. Это особенно важно, если ваши sql и веб-серверы находятся на разных машинах. Попробуйте использовать JOIN для расчета популярности новостных статей, не просматривая все комментарии по отдельности.

Ну, вы можете рассчитать популярность комментариев и популярность новых элементов в том же запросе. (например, выберите сумму (рейтинг) ИЗ новостей, комментариев, рейтинга, ГДЕ comments.news_id = news.id И rating.comment_id = comments.id (этот запрос упрощен, но все же ...)) Потому что ваша главная проблема заключается в количестве запросов Вы должны выполнить, и, безусловно, будет достаточно ресурсов на вашем сервере MySQL. Потому что большую часть времени сервер SQL просто будет ждать следующего запроса. Связь между сетями в миллиард раз медленнее, чем между процессором и оперативной памятью. В основном происходит следующее: php отправляет запрос на сервер MySQL и ждет ответа. Mysql получает запрос обрабатывает, отправляет ответ и ждет следующего запроса. Это ожидание требует времени ... Так что либо уменьшите количество запросов, либо отправьте все запросы одновременно, используя mysqli http://php.net/manual/en/mysqli.multi-query.php

0 голосов
/ 27 февраля 2011

Вместо того, чтобы запускать это как задание cron, вы можете просто обновлять популярность каждый раз, когда выполняется действие, которое изменит его.Например, когда пользователь добавляет комментарий или оценивает элемент, после этого вы обновляете популярность элемента.

0 голосов
/ 23 февраля 2011

Если БД находится на другом сервере, я бы предпочел написать процедуру MySQL для расчета или, по крайней мере, использовать постоянное соединение.В любом случае 5 минут очень часто, особенно для занятых серверов.Обычно, по моему мнению, такое задание должно выполняться от одного до нескольких дней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...