Я знаю, что это действительно расплывчатый вопрос, но мне было интересно, как переменная $ _SESSION может выдерживать стресс. Если $ _SESSION похож на cookie, то, как только пользователь удалит свои куки из браузера, тогда $ _SESSION должен быть уничтожен. Кроме того, если вызывается session_destroy (), то переменная $ _SESSION будет уничтожена.
Существуют ли другие случаи, когда переменная $ _SESSION может быть уничтожена, как, например, сбой веб-сайта? Если PHP перегружен на веб-сайте, должен ли он напрямую влиять на $ _SESSION или любые другие функции и переменные, связанные с ним, или он влияет на все в целом?
Почему я спрашиваю?
Я почти закончил написание сценария оставленной корзины для своего сайта электронной коммерции, и я хотел перенаправить клиентов обратно на сайт, где их заказ все еще будет сохранен в $ _SESSION. Единственный способ уничтожить $ _SESSION — это если клиент завершает покупку. Конечно, клиент также может удалить куки в своем браузере.
Но мне интересно, есть ли еще один случай, когда $ _SESSION может быть уничтожен помимо тех двух, упомянутых выше.
Многие заброшенные системы корзин хранят информацию о заказе в базе данных и включают ее в электронное письмо, которое получает пользователь, чтобы они могли видеть заказ внутри электронного письма. Конечно, я могу записать заказ в базу данных, но проще просто сохранить все в $ _SESSION и попросить клиента вернуться на сайт, оставив свой заказ в активном $ _SESSION.
Что может выжить $ _SESSION?
Сессии обычно хранятся на диске, в каталоге, определяемом session.save_path
(обычно /tmp
).
Когда процесс PHP загружен и вы запускаете session_start()
сеанс восстанавливается с версии, сохраненной на диске. Когда процесс PHP завершается правильно (без ошибок и т. Д.), Текущее состояние сеанса записывается обратно на диск.
Итак, насколько большой может быть сессия? Ограничения:
$_SESSION
переменная занимает много места в вашей памяти. (Возможно, вам придется увеличить memory_limit
.)Есть еще одна важная другая ситуация (помимо тех, которые вы упомянули), где сессии удаляются, это вывоз мусора. В зависимости от того, как настроен ваш сервер, фоновое задание проходит через все сеансы каждые несколько минут и удаляет просроченные. Или каждый Иксго вызов PHP вызывает GC (не вдаваясь в детали, так как они здесь неактуальны). Срок действия по умолчанию зависит от вашей версии PHP и поставщика ОС, но обычно он составляет от 30 минут до 1 часа.
Если у вас есть приложение для покупок, вы можете увеличить срок действия своих сеансов, установив соответствующее значение для session.gc_maxlifetime
,
Переменные сессии сохраняются на вашем сервере. Мои по умолчанию находятся в / var / lib / php / session для моего сервера dev. Однако используемая мной среда обрабатывает их совершенно по-разному, поэтому используемые переменные сеанса находятся в папке приложения.
Они остаются даже после перезагрузки. Однако при использовании сеанса php по умолчанию в папке / tmp при перезагрузке всем пользователям придется перезагружаться … опять же, это зависит от вашей ОС, но большинство / all будет очищать / tmp при перезагрузке.
проверьте ваш session.save_path, чтобы убедиться, что они не сохранены в / tmp, а также session.gc_maxlifetime, чтобы убедиться, что они не истекли. Если ни один из них не установлен, он использует php по умолчанию для вашей системы, который вы должны изучить.