Стандартным хранилищем для $_SESSION
является файловая система с одним файлом на сеанс.Это идет с ценой:
- Когда два запроса обращаются к одному и тому же сеансу, один запрос будет побеждать другой, а другой должен дождаться завершения первого запроса.Состояние гонки, контролируемое блокировкой файлов.
При использовании файлов cookie для хранения данных сеанса (Wordpress, Codeigniter) условие гонки такое же, но блокировка не является имманентной, но браузер можетблокировка в управлении cookie.
Недостатком использования cookie является то, что вы не можете хранить такое количество данных и что данные передаются с каждым запросом и ответом.Это также может вызвать проблемы с безопасностью.Украдите печенье и получите данные.Если он зашифрован, злоумышленник может попытаться расшифровать его, чтобы получить сохраненные в нем данные.
Историческая причина для Wordpress заключалась в том, что платформа никогда не использовала сеансы PHP.Корневой проект начался примерно в 2000 году, он получил большую популярность в 2002 и 2004 годах. Поскольку обработка сессий была доступна только в PHP 4, PHP 3 был гораздо более популярным в то время.
Позже, когда $_SESSION
был доступен, основной дизайн приложения был уже сделан, и он работал.Кроме того, в 2004/2005 году WordPress решила запустить коммерческий хостинг для нескольких блогов.Это создало необходимость в масштабировании приложений на серверах и базе данных cookie +, что выглядело более простым для обработки сеанса / пользователя, чем при использовании реализации $_SESSION
.На самом деле, это довольно просто и просто работает, поэтому никогда не было необходимости его менять.
Для Codeigniter я не могу сказать так много.Я знаю, что он хранит всю информацию о сеансе в куки по умолчанию.Так что сессия - это просто другое имя для cookie.При желании он может быть зашифрован, но это требует настройки.IIRC было сказано, что это было сделано, потому что «большинству пользователей не нужны сессии».Для тех, кто в этом нуждается, существует серверная часть базы данных (требует дополнительной настройки), поэтому пользователи могут прозрачно переходить из cookie в хранилище базы данных в своем приложении.Также доступна новая реализация, которая позволяет вам переходить на любое хранилище, которое вам нравится, например, на нативные сессии PHP.Это делается с помощью так называемых драйверов.
Однако это не означает, что в настоящее время вы не можете добиться того же, основываясь на $_SESSION
.Вы можете заменить хранилище на то, что вам нравится (даже куки-файлы :)), и его реализация на PHP должна быть в любом случае инкапсулирована в хороший дизайн программы.
После этого вы можете реализовать магазин, с помощью которого можно лучше контролировать блокировку(например, база данных), которая работает на серверах в инфраструктуре с балансировкой нагрузки, которая не поддерживает липкие сессии.
Wordpress - хороший пример собственной реализации сессий, полностью независимой от того, что предлагает PHP.Это означает, что колесо было изобретено заново.С сегодняшнего дня я бы не назвал их дизайн явно инновационным, поэтому он полностью удовлетворяет весьма специфические потребности в очень специфической среде, которую вы можете понять, только если знаете о корнях проектов.
Codeigniter isможет быть, на шаг впереди (в смысле интерфейса), поскольку он предлагает некоторый (нестабильный) интерфейс для сессий, и его можно заменить любой реализацией, которая вам нравится.Это гораздо лучше для новых разработчиков, но это также своего рода новое изобретение колеса, потому что PHP делает это уже из коробки.
Лучшее, что вы можете сделать в дизайне приложения, - это сделать реализацию независимой от системы.необходимо, чтобы сделать механизм хранения данных вашего сеанса независимым от остальной части потока программы.PHP предлагает это с довольно прямым интерфейсом, массивом $_SESSION
и конфигурацией сеанса.
Поскольку $_SESSION
- это суперглобальный массив, вы можете запретить своему приложению доступ к нему напрямую, так как это приведет к глобальному состоянию. Таким образом, в хорошем дизайне у вас был бы интерфейс к нему, чтобы иметь возможность полностью абстрагироваться от суперглобального.
Сделав это, плюс абстракция хранилища и конфигурация (например, все в одном контейнере зависимостей сеанса), вы должны иметь возможность масштабировать и поддерживать свое приложение на любом количестве серверов по любой причине. Ваша реализация может просто использовать куки, если вы думаете, что это для вас. Однако вы сможете переключиться на сеанс на основе базы данных, если вам это нужно - без необходимости переписывать большие части вашего приложения.