Есть проблема. Сайту 3 года, около 10000 юзеров. Накопилось личных сообщений - таблицы pm_index и pm_message в базе в сумме больше 400М. Соотв. сайт начинает тормозить, крон обрабатывает ее ок. 30 сек. При нагрузке просто вываливается сервер. В связи с этим 2 вопроса:
1. Есть ли способ частичной очистки ЛС? Например все старше 1года.
2. Есть ли способ ограничить количество ЛС на юзера - напр. чтоб мог хранить не более 50 сообщений (напр. на форумах такое есть многих)?
стандартными средства модуля это никак не реализуется.
в MySQL почти профан - если советы будут по части дествий с базой, сделайте скидку в объяснениях на чайника)
Комментарии
подумалось, что как более реальный вариант ограничения размера базы наверное проще реализовать автоматическое удаление всех сообщений старше чем... (напр. 6 месяцев).
В общем буду благодарен за любую помощь по проблеме - очистке имеющейся базы и недопускания ее чрезмерного разрастания
Связь крона и Privatemsg крайне сомнительна
Возможности ограничения количества сообщений в личке в текущей версии модуля нет, в 3.х автор обещал такую функциональность.
Очистить старые сообщения можно напрямую в БД.
DELETE FROM pm_message
WHERE (UNIX_TIMESTAMP()- TIMESTAMP)>(6*30*24*3600);
#Затем удаляем записи в индексе для которых нет сообщений
DELETE pi FROM pm_index AS pi LEFT JOIN pm_message AS pm ON pi.mid=pm.mid
WHERE pm.mid IS NULL;
Перед экспериментами с базой обязательно сделайте бэкап.
благодарю) все прошло на Ура. По крайней мере пока проблем с очищенными таблицами не вылезало.
на drupal.org нашел способ автоочистки личных сообщений старше чем... с помощью крон.
Перевод:
Нужно следующий скрипт заставить исполнятся при запуске крона. Он использует функцию в модуле PM, которая устанавливает поле pm_index.deleted для сообщения на "1", определяя его статус как "удаленное". Если этот статус установлен, сообщение в дальнейшем будет удалено функцией "Flush deleted messages" (Очистить удаленные сообщения) согласно установкам модуля PM при запуске крона.
<?php
$sql = 'SELECT mid FROM {pm_message} WHERE timestamp < %d'; // Messages older than $timestamp are deleted, example, 90 days ago.
$timestamp = time() - (90 * 86400); $result = db_query($sql, $timestamp); // Fetch over all found messages and mark them as deleted
while ($row = db_fetch_object($result)) {
privatemsg_message_change_delete($row->mid, TRUE);
}
?>
Если старых сообений очень много, может возникнуть необходимость ограничить количество обрабатываемых сообщений, по крайней мере первые несколько запусков крона. В таком случае следует использовать функцию "db_query_range" вместо "db_query". Например:
<?php
$result = db_query_range($sql, $timestamp, 0, 500); // limit to 500 per run
?>
Вопрос к знатокам - как запустить этот скрипт? Как я понимаю, надо создать простенький модуль, назовем его напр. pmcleaner. В общем алгоритм описан - создаем описание в pmcleaner.info по правилам друпала и сам скрипт помещаем в файл pmcleaner.module.
Как именно прописать исполнение его кроном? Можете написать как это будет выглядеть?
p.s. Прошу извинить если вопрос очевиден специалистам - в php мало понимаю, но очень надо - база растет как снежный ком.