Как очистить старые личные сообщения (privatemsg)

Главные вкладки

Аватар пользователя zegmant zegmant 7 февраля 2011 в 6:04

Есть проблема. Сайту 3 года, около 10000 юзеров. Накопилось личных сообщений - таблицы pm_index и pm_message в базе в сумме больше 400М. Соотв. сайт начинает тормозить, крон обрабатывает ее ок. 30 сек. При нагрузке просто вываливается сервер. В связи с этим 2 вопроса:
1. Есть ли способ частичной очистки ЛС? Например все старше 1года.
2. Есть ли способ ограничить количество ЛС на юзера - напр. чтоб мог хранить не более 50 сообщений (напр. на форумах такое есть многих)?
стандартными средства модуля это никак не реализуется.
в MySQL почти профан - если советы будут по части дествий с базой, сделайте скидку в объяснениях на чайника)

Комментарии

Аватар пользователя zegmant zegmant 7 февраля 2011 в 7:43

подумалось, что как более реальный вариант ограничения размера базы наверное проще реализовать автоматическое удаление всех сообщений старше чем... (напр. 6 месяцев).
В общем буду благодарен за любую помощь по проблеме - очистке имеющейся базы и недопускания ее чрезмерного разрастания

Аватар пользователя Krotty@drupal.org Krotty@drupal.org 7 февраля 2011 в 13:58

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

#Удаляем сообщения старше 6 месяцев (180 дней)
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;

Перед экспериментами с базой обязательно сделайте бэкап.

Аватар пользователя zegmant zegmant 11 февраля 2011 в 4:35

на 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->midTRUE);
}
?>

Если старых сообений очень много, может возникнуть необходимость ограничить количество обрабатываемых сообщений, по крайней мере первые несколько запусков крона. В таком случае следует использовать функцию "db_query_range" вместо "db_query". Например:

<?php
$result 
db_query_range($sql$timestamp0500); // limit to 500 per run
?>

Вопрос к знатокам - как запустить этот скрипт? Как я понимаю, надо создать простенький модуль, назовем его напр. pmcleaner. В общем алгоритм описан - создаем описание в pmcleaner.info по правилам друпала и сам скрипт помещаем в файл pmcleaner.module.
Как именно прописать исполнение его кроном? Можете написать как это будет выглядеть?

p.s. Прошу извинить если вопрос очевиден специалистам - в php мало понимаю, но очень надо - база растет как снежный ком.