Проверьте, используется ли PHP session_id - PullRequest
6 голосов
/ 01 июня 2011

Я создаю веб-приложение, в котором пользователи могут загружать определенные файлы и работать с ними через интерфейс веб-приложения. Мне нужно хранить эти файлы на протяжении всей сессии пользователя. Я создаю папку для каждого пользователя, используя session_id в качестве имени папки и сохраняю там файлы.

Проблема: Ничто не указывает на то, что пользователь ушел с моего сайта и сеанс выходит из строя. Мне нужен скрипт очистки, который берет имя каждой папки и проверяет, активен ли session_id, чтобы удалить неиспользуемые и теперь недоступные папки. Как я могу это сделать?

Ответы [ 4 ]

7 голосов
/ 21 сентября 2011

У меня была точно такая же проблема.Мое решение состояло в том, чтобы проверить файл сеанса:

<?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.

1 голос
/ 02 июня 2011

Проблема, с которой вы столкнулись, в основном та же (на менее сложном уровне), которая возникает, когда у вас есть пользовательский каталог файлов сессий.Тебе тоже нужно это почистить.Этот процесс также известен как сборка мусора.

Обычно это выполняется с помощью запуска на стороне сервера задания уборщика, которое проверяет устаревшие файлы сеансов или, в вашем примере, устаревшие каталоги сеансов (это можетcron job).

Вот как это работает:

Большинство файловых систем хранят дату создания и последнего доступа к файлу.Поэтому, если время сеанса истекло, оно больше не использовалось в течение X часов.Таким образом, вы можете с уверенностью предположить, что если к файлу сеанса не обращались в течение последних X часов, сеанс мертв, и все файлы, «более старые», чем этот период времени, могут быть безопасно удалены.Для вашего каталога вы можете захотеть добавить файл внутри, который вы хотите использовать в качестве тестового файла для отслеживания времени доступа.

В руководстве по php есть несколько примеров этого: http://www.php.net/manual/en/session.configuration.php#ini.session.save-path (ищитескрипт mod_files.sh)

1 голос
/ 02 июня 2011

Я нашел это полезным / я думаю, что это отвечает на ваш вопрос:

Лучшее место для хранения больших объемов данных сеанса

0 голосов
/ 02 июня 2011

Если у вас есть доступ к crontab или запланированным задачам сервера, вы можете создать php-файл, который разрешено выполнять только локально, который проверяет значение даты / времени истечения срока действия всех сеансов, найденных в вашей базе данных.Каждый раз, когда пользователь обновляет этот срок действия, значение даты / времени будет обновляться до следующего значения времени ожидания (+30 минут и т.беспорядок они оставили без выхода.Я бы не советовал запускать запланированное задание / crontab слишком часто.По крайней мере, время повторения должно быть несколько минут, что имеет смысл для вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...