Можно ли реализовать самоочищающуюся таблицу в mysql, или как поймать момент истечения сессии?
Хочу реализовать подобие самоочищающейся таблицы, из которой будут удаляться все записи с sessid = id истекшей сессии на этой машине. Либо сделать так, чтобы при достижении лимита строк старые строки выталкивались и их место занимали бы новые записи.
Начал смотреть в сторону memory, но это совершенно не то, что нужно. Можно реализовать подобное велосипедом из десятков строк php кода, но, тут уже встает вопрос о том, как поймать (без проверки по крону) истечение сессии. И может, есть более эффективные и простые способы (например, mysql триггеры), нежели создание велосипеда из десятков (если не сотен) строк кода?
Буду благодарен за советы и рекомендации, спасибо.
Не храните информацию о сессиях в MySQL, храните ее в таком хранилище, в котором можно задать время жизни записи при установке значения.
Например, в Redis.
Что значит десятки-сотни строк кода? И вопрос "как поймать истечение сессии"? Так или иначе, в определённый момент вы запрашиваете сессию из базы, и проверить истекла она или нет, в этот самый момент, это совершенно дешево по ресурсам и решается строчкой кода.
Ну и раз вы за чистоту бд так боретесь, что готовы удалять сессии, что аж крон вам враг. То либо вы их не чистите вообще и они копятся мегабайтами, либо совершенно зря на этом зацикливаетесь.
И кто мешает сделать у пользователя(допустим таблица users) поле sid(в котором хранится id актуальной сесии). А sid в это случае - это ссылка на другую таблицу, где уже собственно вся информация по сессии доступна, и когда создана и всё остальное. Тут уже чистить особо ничего не надо.
А если пользователь вошел (записалась строка в БД), и уже никогда не зайдет на сайт? А строка, которая записалась, должна будет удалиться по истечению его сессии. Можно проверять все записи в БД при каждой записи, но это уже костыль какой-то, плюс их может быть много.
Суть в том, что есть таблица _tmp, где хранятся временные данные, которые должны существовать ровно 1 сессию. По истечении сессии они там остаются. В общем-то, это все.
Ну никогда не зайдёт больше пользователь и что страшного, что 1 запись о сессии останется? Т.е. то что в бд запись о пользователе будет это нормально, а запись о сессии это плохо? Так вы и пользователей удаляйте, которые месяц не заходят ))
Для такой чистки как вам нужна, лучше крона нет. И выдумывать костыли избегая крона -- очень плохо.
С триггерами на вряд ли что то получится.
Как писали выше, можно организовать с помощью cron`а.
Через PHP задавать время жизни сессии.
Больше адекватных решений я не вижу.