2009-07-20 4 views
1

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

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

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

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

ответ

3

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

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

+0

Не могли бы вы рассказать о том, почему это не должно быть напрямую set (при условии, что какие-либо данные, введенные клиентом, были дезинфицированы)? – Sev

+1

Глобальное состояние - очень опасная вещь, когда вы программируете. Именно тогда много кода из разных мест может изменить «состояние» приложений, если у вас нет хорошего способа сообщить, какой фрагмент кода выполняет это. Это будет хлопот для отладки. Если вы используете класс в качестве точки входа, вы можете, по крайней мере, быть уверенным, чтобы ловушка ошибок при входе в систему. Посмотрите, как Misko Hevery объясняет это лучше, чем я: http://www.youtube.com/watch?v=-FRm3VPhseI – Stojg

0

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

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

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

+0

Функция session_save_handler() кажется мне недостаточной. Мне нужно реализовать свое собственное ID-поколение, -invalidation и так далее. Поэтому необходимо изменить не только хранение сеансов, но и все управление сеансом. –

0

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

+0

Я уже нашел эту страницу, в любом случае речь идет о управлении сеансовым хранилищем, а не о самом управлении сеансом - как указано в комментарии к сообщению JRSofty! –

+0

. Функция 'session_set_save_handler()' is is register - функции регистра, которые вызывается, когда используется собственный API-интерфейс сеанса. Он не заменяет существующую библиотеку PHP, просто добавляет к ней некоторые привязки. – Xenon

1

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

Посмотрите, как Zend или Солнечная система обрабатывают доступ к сеансу.

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

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

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

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

+0

«Похоже, вы хотите отвлечься от переменной $ _SESSION, чем вы хотите изменить хранилище». - Это не совсем то, что я хочу. Лучшее решение было бы, если бы я мог использовать $ _SESSION, но в фоновом режиме моя SessionManagement вызывается вместо оригинальной PHP. Другим примером может быть session_start() - который инициализирует MY SessionManagement. Предлагает ли PHP интерфейс и возможность конфигурации для этого? –

+0

Я никогда не использовал его, но первый аргумент обратного вызова для session_set_save_handler() - тот, который вызывается на session_start(). Таким образом, вы можете подключить свое поколение session_id(). Чтобы зарегистрировать методы объекта с помощью ession_set_save_handler(), посмотрите здесь. http://www.mt-soft.com.ar/2007/12/21/using-a-mysql-database-to-store-session-data/ – GrGr

1

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

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

0

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

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

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

Функции:

Вы можете использовать функцию runkit_function_redefine(), которая является частью Runkit API, чтобы переопределить session_ хххх функции.
Примечание: Runkit является частью PECL. То есть, НЕ НАПРЯЖЕНЫ С PHP. Вам нужно будет install it yourself.

переменной сессии:

$_SESSION = &SessionClass->data; 

сама простота: просто сделать $_SESSION в качестве ссылки на свои данные.