#php #apache #session
#php #apache #сеанс
Вопрос:
Я хотел бы знать, как проверить, работает ли PHP-сеанс по-прежнему, благодаря заданному ID. Это или что-нибудь, что могло бы дать мне доступ к списку активных сеансов.
Я нашел некоторую соответствующую информацию в Интернете, но не смог получить правильный ответ.
Чтобы рассказать вам немного о предыстории, я пишу веб-сайт, который позволяет пользователям изменять контент (скажем, статьи, например). И поскольку я не хочу, чтобы они одновременно модифицировали один и тот же ресурс, мне пришлось подумать о системе защиты.
Итак, идея заключалась в том, что каждый открытый ресурс был бы заблокирован и связан с идентификатором сеанса. По завершении пользователь освободит его. Но, конечно, ничто не мешает ему просто закрыть окно, позволяя содержимому заблокироваться в письменной форме.
Поэтому я должен иметь возможность проверить, все ли еще активен сеанс, и является ли блокировка по-прежнему законной.
Ответ №1:
Есть довольно простое решение вашей проблемы:
При открытии страницы сохраните идентификатор пользователя и текущую временную метку в некоторых столбцах, используемых для блокировки элемента. На странице включите некоторый JavaScript, чтобы каждую минуту вызывать какой-либо скрипт, который обновляет временную метку — так что, пока пользователь находится на этой странице, временная метка никогда не будет старше 1 минуты. Просто запретите другим пользователям редактировать тот же элемент, если временная метка не старше 1 минуты (и нескольких секунд).
Комментарии:
1. 1; однако, возможно, было бы более целесообразно использовать идентификатор сеанса вместо идентификатора пользователя в случае, если один и тот же пользователь редактирует один и тот же фрагмент из нескольких браузеров или компьютеров.
2. В этом случае он просто перезаписывает свои собственные изменения, чтобы он, вероятно, знал, что делает — кроме того, потеря сеанса (сбой браузера, удаление файлов cookie и т.д.) В противном случае заблокировала бы реального пользователя — даже если это всего лишь на короткое время.
3. То, что вы предлагаете, действительно является возможным решением. Но я должен признать, что мне не очень нравится идея запрашивать базу данных каждые ‘n’ минут, это звучит немного тяжеловато. Но в любом случае, я использую фреймворк CodeIgniter, и я понял, что у него есть обработчик сеанса базы данных, так что моя проблема решена: мне просто нужно выбрать нужные данные.
4. (извините за промах). Тем не менее, я сохраню вашу идею использования имени пользователя вместо идентификатора сеанса по причине, которую вы упомянули чуть выше. Но, просто из любопытства, кто-нибудь знает, как сделать то, что я спросил сначала? Потому что я уверен, что это может быть полезно! И в любом случае, спасибо вам всем за ваши ответы.
5. Простой выбор / обновление с использованием индексов не проблема, даже если вы делаете это каждую секунду.
Ответ №2:
Я знаю, что это может быть более старый вопрос, но «лучший» ответ на ваш вопрос находится здесь: http://www.codeguru.com/forum/archive/index.php/t-372050.html
Вот что он говорит: Файл php.ini содержит параметр с именем sesison.save_path , который определяет, куда PHP помещает файлы, содержащие данные сеанса. Как только сеанс устареет, он будет удален PHP во время следующей сборки мусора. Следовательно, проверка на наличие файла для этого сеанса должна быть достаточной, чтобы определить, действителен ли сеанс по-прежнему.
$session_id = 'session_id';
$save_path = ini_get('session.save_path');
if (! $save_path) {
$save_path = '.'; // if this value is blank, it defaults to the current directory
}
if (! file_exists($save_path . '/sess_' $session_id)) {
unlink($session_id); // or whatever your file is called
}