Я создаю веб-приложение, чтобы пользователи могли загружать определенные файлы и работать с ними через интерфейс веб-приложений. Мне нужно сохранить эти файлы для длины сеанса пользователей. Я создаю папку для каждого пользователя, используя session_id
качестве имени папки и сохраняя там файлы.
Проблема. Нет ничего, что указывало бы на то, что пользователь ушел с моего сайта, и сессия выходит из употребления. Мне нужен сценарий очистки, который берет имя каждой папки и проверяет, активен ли этот session_id
, чтобы удалить неиспользуемые и недоступные сейчас папки. Как я могу это сделать?
У меня была точно такая же проблема. Мое решение состояло в том, чтобы проверить файл сеанса:
<?php // clean-up script. Get cron/windows task scheduler to run this every hour or so // this is the path where PHP saves session files $session_path = ini_get('session.save_path'); // this is the directory where you have created your folders that named after the session_id: $session_files_dir = '/path/to/your/save/dir'; // loop through all sub-directories in the above folder to get all session ids with saved files: if ($handle = opendir($session_files_dir)) { while (false !== ($file = readdir($handle))) { // ignore the pseudo-entries: if ($file != '.' && $file != '..') { // check whether php has cleaned up the session file if ( file_exists("$session_path/sess_$file") ) { // session is still alive } else { // session has expired // do your own garbage collection here } } } closedir($handle); } ?>
Обратите внимание, что это предполагает, что для параметра session.save_handler
ini установлено значение "files"
, параметр session.save_path
не имеет префикса на уровне каталогов (т. Е. Не соответствует регулярному выражению /^\d+;/
), и этот автоматический мусор php сбор включен. Если одно из приведенных выше предположений неверно, вы все равно должны внедрять сборку мусора вручную, поэтому можете добавить к этому код очистки.
Это также предполагает, что единственными файлами в $session_files_dir
являются ваши папки для каждого сеанса, и все они названы по имени связанного с ними session_id.
Проблема, которая у вас есть, в основном та же проблема (на менее сложном уровне), которая возникает, когда у вас есть собственный файл файла сеанса. Вам также нужно очистить себя. Этот процесс также известен как сбор мусора.
Обычно это делается, если на стороне сервера выполняется работа janitor, которая проверяет устаревшие файлы сеанса или в вашем примере на устаревшие каталоги сеансов (это может быть задание cron).
Вот как это работает:
Большинство файловых систем хранят дату создания и последнего доступа к файлу. Поэтому, если время ожидания сеанса больше не используется в течение X часов. Таким образом, вы можете с уверенностью предположить, что если в течение последних Х часов, когда сеанс мертв, не было доступа к файлу сеанса, и все файлы «старше», чем это время, можно безопасно удалить.
Работа выполнена. Для вашего каталога вы можете добавить файл внутри, который вы хотите использовать в качестве тестового файла для отслеживания времени доступа.
В руководстве по php есть несколько примеров этого: http://www.php.net/manual/en/session.configuration.php#ini.session.save-path (найдите скрипт mod_files.sh)
Я нашел это полезным /, я думаю, он обращается к вашему вопросу:
Лучшее место для хранения больших объемов данных сеанса
Если у вас есть доступ к crontab или запланированным задачам сервера, вы можете создать файл php, который разрешен только локально, который проверяет значение даты / времени истечения всех сеансов, найденных в вашей базе данных. Каждый раз, когда пользователь обновляет это истечение, значение Дата / Время будет обновлено до следующего значения таймаута (+30 минут и т. Д.).
Ваша запланированная задача / crontab найдет всех тех пользователей, которые простаивают и очищают беспорядок, который они оставили без выхода из системы. Я бы не предложил, чтобы ваша запланированная задача / crontab выполнялась слишком часто. По крайней мере, у вас осталось несколько минут, что имеет смысл для вашей ситуации.