Сессии PHP, домены без cookie и производительность - PullRequest
4 голосов
/ 18 сентября 2011

Я в курсе всех доменов без файлов cookie / CDN и понимаю, как просто отправлять файлы cookie для запросов на сайт www.yourdomain.com, а также настраиваю отдельный домен, например cdn.yourdomain.com, чтобы предотвратить ненужные файлы cookie.отправка может повысить производительность.

Что мне интересно, так это то, что использование нативных сессий PHP отрицательно влияет на производительность, и если да, то как?Я знаю, что ключ сеанса отслеживается в файле cookie, который является небольшим, и, таким образом, это выглядит нормально.

Мне предлагается задать этот вопрос, потому что в прошлом я писал свои веб-приложения и сохранялlof активных данных пользователя, предпочтений и информации аутентификации в переменной $_SESSION.Однако я заметил, что некоторые популярные веб-приложения, такие как Wordpress, вообще не используют $_SESSION.Но сессии просты в использовании и кажутся довольно безопасными, особенно если вы объединяете их с отслеживанием изменений user-agent / ip для предотвращения перехвата сессии.Так почему же Wordpress и другие веб-приложения не используют сессии php?Должен ли я также прекратить использовать сеансы?

Кроме того, позвольте мне также уточнить, что я понимаю, что сервер должен загружать данные сеанса для обработки запроса страницы, но здесь я не об этом спрашиваю.Мой вопрос о том, если / как это влияет на производительность сети, особенно в отношении отправляемых / получаемых заголовков.Например, использование сеансов предотвращает обслуживание страниц или изображений на сайте из кэша браузера?Является ли файл cookie PHPSESID единственным дополнительным заголовком, который отправляется?Такие вещи.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2011

Стандартным хранилищем для $_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 - это суперглобальный массив, вы можете запретить своему приложению доступ к нему напрямую, так как это приведет к глобальному состоянию. Таким образом, в хорошем дизайне у вас был бы интерфейс к нему, чтобы иметь возможность полностью абстрагироваться от суперглобального.

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

1 голос
/ 18 сентября 2011

Я не уверен на 100%, что это так, но одна из причин, по которой следует избегать встроенного в PHP механизма $ _SESSION, - это если вы хотите развернуть свое веб-приложение в сценарии веб-фермы высокой доступности.

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

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

Как я уже говорил вВ начале я не уверен на 100%, поддерживает ли PHP настройку поставщика состояния сеанса в качестве базы данных или сервера состояния сеанса вместо действующего по умолчанию.

...