Реализация собственного управления сеансами в PHP

Какие есть варианты для реализации собственного управления сеансами в PHP?

Есть ли хороший способ реализовать компонент, который выполняет все задачи сеанса? Как я могу создать класс, который получает HTTP-запрос и ответ во время одного процесса запроса? Я нашел только параметр session_save_handler, который, кажется, определяет обработчик хранилища. Что мне нужно, так это заменить все управление сеансом. Есть ли другой способ использования конфигурации PHP или мне нужно реализовать собственный контроллер, который принимает все запросы и вызывает мое управление сеансом?

Спасибо за вашу помощь

С уважением Майкл


person Michael S    schedule 20.07.2009    source источник


Ответы (6)


Нет, к сожалению, нет интерфейса для переключения встроенных «модулей» на свои собственные. Есть несколько хуков (например, session_save_handler(), set_error_handler()), и это, к сожалению, так.

$ _SESSION является «суперглобальным», и IMO не следует устанавливать напрямую в любом случае, если вы работаете над более крупными проектами. Тогда было бы лучше использовать собственный класс, отвечающий за обработку сессий. Упростит отладку кода и тому подобное.

person Stojg    schedule 20.07.2009
comment
Не могли бы вы пояснить, почему его не следует устанавливать напрямую (при условии, что любые данные, введенные клиентом, были очищены)? - person Sev; 20.07.2009
comment
Глобальное состояние - очень опасная вещь при программировании. Это когда большое количество кода из разных мест может изменить «Состояние» приложений, а у вас нет надежного способа сказать, какой фрагмент кода это делает. Будет хлопотно отлаживать. Если вы используете класс в качестве точки входа, вы, по крайней мере, можете быть уверены в том, что отлавливаете ошибки, когда они попадают в систему. Посмотрите, как Миско Хевери объясняет это лучше, чем я: youtube.com/ смотреть? v = -FRm3VPhseI - person Stojg; 20.07.2009

Я не уверен, чего вы хотите достичь. Похоже, вы больше хотите абстрагироваться от переменной $ _SESSION, чем изменить хранилище.

Взгляните на то, как Zend или Solar framework обрабатывают доступ к сеансу.

http://www.phpeveryday.com/articles/Zend-Framework-Session-Introduction-P571.html http://solarphp.org/manual:sessions

Как я могу создать класс, который получает HTTP-запрос и ответ во время одного процесса запроса?

Я не знаю, что вы имеете в виду, получая ответ, но у фреймворков есть контроллеры front- / page, которые направляют к выбранному действию, а затем вызывают метод, который может получить доступ к Session (чтение / запись) и Request (чтение) объектов и генерирует объект Response, который затем обрабатывается с помощью шаблона.

Для автоматического тестирования вы можете создать свои собственные объекты Request и Session и передать их контроллеру страницы.

person GrGr    schedule 20.07.2009

Вы сами это сказали в одном из комментариев. Просто оберните $ _SESSION в класс. Я не думаю, что вы можете заменить его, но вы, безусловно, можете создать для него свой собственный интерфейс.

Вы могли бы, например. Создайте класс, который создается первым, и вызовите session_start () внутри конструктора.

person Dave Archer    schedule 20.07.2009

Использование функции session_save_handler() позволяет управлять тем, как информация о сеансе сохраняется и извлекается.

По умолчанию PHP хранит информацию о сеансе во временных файлах, расположенных где-то на вашем веб-сервере. Вы можете определить функции обратного вызова, используя функцию session_save_handler(), где вместо этого вы можете хранить эту информацию в таблице базы данных.

Даже если вы обрабатываете сеансы с вашими собственными определенными функциями с помощью функции session_save_handler(), вы все равно получите доступ к информации с помощью суперглобальной переменной $ _SESSIONS.

person Community    schedule 20.07.2009
comment
Мне кажется, что функции session_save_handler () недостаточно. Мне нужно реализовать собственное генерирование идентификаторов, проверку подлинности и т. Д. Следовательно, необходимо изменить не только хранилище сеансов, но и само управление сеансами. - person Michael S; 20.07.2009

Посетите эту страницу в интерактивном руководстве по php. Имеет много полезной информации по вашему вопросу. Надеюсь, поможет.

person Community    schedule 20.07.2009
comment
Я уже нашел эту страницу, в любом случае она об управлении хранилищем сеансов, а не о самом управлении сеансами - как указано в комментарии к сообщению JRSofty! - person Michael S; 20.07.2009
comment
Функция session_set_save_handler() регистрирует функции, которые вызываются при использовании собственного API сеанса. Он не заменяет существующую библиотеку PHP, а просто добавляет к ней некоторые хуки. - person Lux; 15.01.2015

Вы можете создать реализацию сеанса с файлами cookie и базой данных. Вы устанавливаете cookie на клиентском компьютере. Затем вы запускаете поиск в базе данных, примерно так:

+--------+------+
| sessid | data |
+--------+------+

Где sessid содержит ссылку на файл cookie (возможно, какой-то король хешей md5 или SHA), а данные представляют собой что-то вроде массива JSON или Serialized.

Функции:

Вы можете использовать функцию runkit_function_redefine (), которая является частью Runkit API, чтобы переопределить функции session_ xxxx .
Примечание: Runkit является частью PECL. То есть НЕ В КОМПЛЕКТЕ С PHP. Вам придется установить его самостоятельно.

Переменная сеанса:

$_SESSION = &SessionClass->data;

Сама простота: просто сделайте $_SESSION ссылкой на ВАШИ данные.

person Lux    schedule 15.01.2015