Что лучше: проверьте базу данных или просто проверьте сеанс на каждой странице с помощью PHP

Я разработал много систем входа на PHP. По сути, для каждого созданного мной веб-сайта или приложения у него была схема входа в систему для создания статей, загрузки изображений, редактирования комментариев и т.д.

У меня никогда не было проблем с этим, кроме одного раза, когда я создал своего рода социальную страницу на своем веб-сайте. Был пользователь, который беспокоил других пользователей, поэтому я решил удалить его профиль, поэтому прошу вашей помощи.

В то время я просто проверял сеанс на каждой странице, например:

<?php
if($_SESSION['loggedin'] === true)
{
    // Keep that page
}
else
{
    // redirect to login page   
}
?>

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

Итак, каков наиболее распространенный и лучший способ обработки сеансов на каждой странице: проверять базу данных каждый раз или просто проверять, является ли сеанс истинным?


person Foreba    schedule 25.03.2012    source источник
comment
Вам следует добавить правило перезаписи .htaccess с его IP-адресом, перенаправляющим их на страницу выхода, simpleszzz   -  person Lawrence Cherone    schedule 25.03.2012


Ответы (3)


Не знаю, как лучше, но делаю примерно так:

У меня есть таблица sql с сеансами (например, идентификатор пользователя, идентификатор сеанса, истекший срок, ...).

Идентификатор сеанса "сохраняется" в $ _SESSION ['cms_session'].

Если идентификатор сеанса, который находится в $ _SESSION ['cms_session'], не существует в таблице сеанса, пользователь больше не вошел в систему.

Для удаления старых сессий в таблице я использую crons.

person Community    schedule 25.03.2012

Что вы пытаетесь сделать, так это создать единое место, где вы можете поддерживать статус пользователя и знать, что изменение будет отражено немедленно.

Проверка поля user_status в БД - довольно эффективный вызов для каждого запроса. Это обеспечивает единое место, где вы знаете, что если вы деактивируете пользователя, изменения будут отражены при его следующем запросе. Вы также можете легко сделать это, не создавая другой набор процедур для просмотра переменных сеанса или создавая своего рода систему обмена сообщениями, в которой приложение объявляет, что пользователь был деактивирован.

person Brian Hoover    schedule 25.03.2012
comment
Да, на самом деле я сейчас использую этот метод, я просто хотел узнать, согласны ли со мной другие разработчики в этом случае. Благодарность - person Foreba; 25.03.2012
comment
Для небольших сайтов это было бы эффективно, но если вы намереваетесь масштабироваться для «большого» количества пользователей (а «большой», конечно, определяется мощностью вашего сервера / кластера), вам просто нужно перейти к памяти решение на основе memcache. Подход Брайана на самом деле очень похож на то, что мы сделали в Armor Games, где мы хранили все данные сеанса в кэше памяти вместе с активным флагом пользователя. Запрос кэша памяти для нескольких ключей с помощью вызова типа memcache_get($memcache_obj, array($key1,$key2,$key3,etc)) был для нас невероятно эффективным. - person iandouglas; 25.03.2012
comment
@iandouglas - я согласен с вами в отношении большого сайта, но это значительно усложняет систему для сайта небольшого или даже среднего размера. - person Brian Hoover; 25.03.2012
comment
@BrianHoover Да, я согласен. Если вы используете учетную запись общего хостинга, у вас может не быть доступа к такому инструменту, как memcache. Но вы используете VPS или другую среду, которую вы можете полностью настроить (например, EC2), тогда вам нужно всего несколько минут, чтобы установить memcached, использовать Pear для установки библиотеки memcache для PHP и добавить несколько строк кода. Больше особо нечего. - person iandouglas; 25.03.2012

Проверять базу данных каждый раз при загрузке страницы действительно неэффективно. Если все, что вы пытаетесь сделать, это убить его сеанс, вам следует сохранить сеансы в memcached, где «ключ» основан на имени пользователя, что-то вроде «johnsmith-session», а затем на странице администратора отправить сообщение в memcached по адресу убейте этот ключ, который должен немедленно вывести его из вашего сайта.

Если PHP в настоящее время записывает данные сеанса на диск, в зависимости от того, как данные сериализуются, вы можете отследить его файл сеанса на диске и удалить этот файл, что сделает то же самое: в следующий раз, когда пользователь попытается загрузить новая страница, его сеанс будет недействительным, и ему потребуется снова войти в систему.

Имейте в виду, что по-настоящему постоянные проблемы пользователи часто повторно регистрируют новую учетную запись, чтобы продолжить свои шалости, поэтому вам понадобятся другие средства отслеживания новых регистраций от этого человека.

person iandouglas    schedule 25.03.2012