Существуют ли ограничения для переменных сеанса? - PullRequest
54 голосов
/ 25 ноября 2010

Как видно из заголовка, существуют ли ограничения (если таковые имеются) для переменных сеанса или они рассматриваются как обычные переменные и могут хранить одинаковое количество данных?

Я смотрю, есть ли другие ограничения помимо переменных типа, такие как максимальная длина, максимальные значения и т. Д.

P.S. Если вопрос неясен, пожалуйста, дайте мне знать.

Заранее спасибо!

Ответы [ 4 ]

52 голосов
/ 25 ноября 2010

Как сказал @Thariama, количество переменных не ограничено; кроме того, нет ограничений на объем данных, которые вы можете хранить в сеансе (я видел сеансы размером в десятки МБ).

По мере увеличения размера сеанса вы столкнетесь с различными причудами: PHP 5 десериализует весь сеанс в память на session_start() (используя обработчик сеанса по умолчанию - вы можете создать собственное решение , конечно); с сеансом 20 МБ и 50 одновременными пользователями ваши сценарии начинают сильно ограничиваться скоростью доступа к диску (например, «запуск сценария медленный, как меласса» - одни сеансы будут занимать ГБ ОЗУ); в конце концов, мы выделили ящик для хранения как можно большего количества сессий в своей оперативной памяти, и внешние интерфейсы получили к ним доступ через NFS (хотя это помогло в нашем случае, это может быть излишним для вас).

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

15 голосов
/ 25 ноября 2010

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

8 голосов
/ 25 ноября 2010

Это полностью зависит от вашего веб-сервера. Для Apache посмотрите здесь:

http://httpd.apache.org/docs/trunk/mod/mod_session.html

Он даже позволяет сохранять сеансы в базе данных с помощью mod_session_dbd . Поэтому физические ограничения, такие как 1 файл за сеанс, могут быть преодолены. Кроме того, Apache можно настроить так, чтобы он отслеживал сеансы каждого пользователя, хранящиеся на конкретном сервере или группе серверов, для масштабируемости.

3 голосов
/ 25 ноября 2010

Простой ответ - нет.(То есть они имеют не больше ограничений, чем любая другая переменная PHP ... должна помещаться в память и т. Д.)

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

...