loader
СГБ - Сологуб
Заказать услуги

Чиним переполненную таблицу _session в Joomla

Example blog post alt

Почему таблица _session растёт

Joomla хранит информацию о сессиях каждого посетителя в таблице #__session (например, abc_session, если префикс abc_). При настройках по умолчанию:

  • Время жизни сессии большое (по умолчанию 15 минут в Joomla, но иногда выставляют часы/дни);
  • Вероятность сборки мусора (session.gc_probability / session.gc_divisor) в PHP часто стоит 0 или очень низкая — то есть PHP-сборщик мусора почти никогда не срабатывает;
  • Боты и парсеры заходят кучей, и каждый создаёт сессию.

В результате мёртвые сессии копятся, таблица раздувается.

Шаг 1. Быстрая чистка вручную

Заходим в phpMyAdmin (или через консоль) и чистим всё, что уже протухло:

 -- Посмотреть, сколько мусора накопилось
SELECT COUNT(*) FROM `abc_session` WHERE `time` < UNIX_TIMESTAMP() - 3600;
-- Удалить старые сессии (старше 1 часа)
DELETE FROM `abc_session` WHERE `time` < UNIX_TIMESTAMP() - 3600;
-- Оптимизировать таблицу, чтобы вернуть место на диск
OPTIMIZE TABLE `abc_session`;

  Тут abc_ — ваш префикс таблиц, а time — поле с unix-временем последней активности сессии. Меняй префикс на свой.  

Шаг 2. Настраиваем автоочистку в Joomla

В админке Joomla есть встроенная уборка:

Система → Общие настройки → вкладка «Система» → раздел «Сессия» (Session):

Параметры, которые стоит выставить:

  • Session Handler — Database (тогда Joomla сама периодически чистит таблицу согласно настройкам ниже);
  • Session Lifetime (Время жизни сессии) — 15–30 минут. Дольше обычно не нужно, если у сайта нет корзин/форм с долгой работой;
  • Session GC (сборщик мусора) — оценка.

Но встроенная уборка в Joomla тоже ленивая — она запускается по вероятности при заходе посетителя. Поэтому самый надёжный путь — следующий шаг.

Шаг 3. Крон-задача (чтобы не возвращалось)

Ставим чистку по крону, чтобы мусор вычищался регулярно, вне зависимости от трафика:

Вариант А — SQL напрямую через cron:

Добавляем в crontab (или в планировщик хостинга) строку, которая раз в час чистит таблицу:

 0 * * * * mysql -uИМЯ_БД -pПАРОЛЬ ИМЯ_БД -e "DELETE FROM abc_session WHERE time < UNIX_TIMESTAMP() - 3600;"

  Либо через PHP, если из консоли mysql недоступен: создай файл cron_session_clean.php в корне сайта:  

 <?php
// Защита от запуска из браузера
if (PHP_SAPI !== 'cli') { die('Only CLI');
}
define('_JEXEC', 1);
define('JPATH_BASE', __DIR__);
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
$db = JFactory::getDbo();
$query = $db->getQuery(true) ->delete($db->quoteName('#__session')) ->where($db->quoteName('time') . ' < ' . (time() - 3600));
$db->setQuery($query);
$db->execute();
echo "Session table cleaned: " . $db->getAffectedRows() . " rows\n";

И в cron:

 0 * * * * php /путь/к/сайту/cron_session_clean.php

Вариант Б — использовать штатный компонент Joomla. Есть готовые плагины (например, «Cache Cleaner» или уборка через Action Scheduler), которые вешают очистку на внутренний планировщик Joomla. Это удобно, если нет доступа к cron. Но по надёжности cron с PHP-скриптом — самый надежный вариант.

Шаг 4. Ограничиваем появление новых мусорных сессий (по желанию)

Чтобы боты и поисковики не накручивали сессии:

  • В файле .htaccess (или конфиге nginx) можно отдавать ботам кеш через страницы без старта сессии — но это уже оптимизация уровня «продвинутая».
  • Самое простое — уменьшить время жизни сессии до 15 минут. Тогда даже если боты назаходят, сессии быстро протухнут и уберутся первым же кроном.
0 Комментариев
Что-бы оставить свой комментарий Вы должны авторизоваться на сайте
x
Тема пуша
Сообщение пуша
Наверх
Отправить заявку
Нажимая на кнопку, вы даете согласие на обработку своих персональных данных