Joomla хранит информацию о сессиях каждого посетителя в таблице #__session (например, abc_session, если префикс abc_). При настройках по умолчанию:
session.gc_probability / session.gc_divisor) в PHP часто стоит 0 или очень низкая — то есть PHP-сборщик мусора почти никогда не срабатывает;В результате мёртвые сессии копятся, таблица раздувается.
Заходим в 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-временем последней активности сессии. Меняй префикс на свой.
В админке Joomla есть встроенная уборка:
Система → Общие настройки → вкладка «Система» → раздел «Сессия» (Session):
Параметры, которые стоит выставить:
Database (тогда Joomla сама периодически чистит таблицу согласно настройкам ниже);Но встроенная уборка в Joomla тоже ленивая — она запускается по вероятности при заходе посетителя. Поэтому самый надёжный путь — следующий шаг.
Ставим чистку по крону, чтобы мусор вычищался регулярно, вне зависимости от трафика:
Вариант А — 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-скриптом — самый надежный вариант.
Чтобы боты и поисковики не накручивали сессии:
.htaccess (или конфиге nginx) можно отдавать ботам кеш через страницы без старта сессии — но это уже оптимизация уровня «продвинутая».Мы используем файлы cookie для улучшения вашего опыта на нашем сайте. Прочтите наше соглашение о конфиденциальности для получения дополнительной информации.