Я много узнал о начале сеанса из моего предыдущего вопроса . Теперь мне интересно, как происходит блокировка сеанса, когда файлы включены в другие файлы. Допустим, у меня есть:
page.php
include('header.php'); ...some html content.... include('sub_page.php'); ...more html....
header.php:
session_start(); ..save session vars... ..print web page header...
sub_page.php
session_start(); ...use session vars.... ..print page content...
Когда я открываю page.php, сеанс разблокируется, как только заголовок загорается? или он жив для всей жизни page.php, поэтому сеанс sub_page заблокирован? Требуется ли session_start
в sub_page? Было бы лучше, если бы я session_write_close
каждый раз, когда я закончил с данными сеанса? (Хотя это будет означать session_start
каждый раз, когда я хотел бы использовать переменную сеанса).
Я бы рекомендовал создать файл session.php
который вы бы включили один раз, в первую строку каждой страницы. Таким образом, сеанс обрабатывается в ОДНОМ файле, если вам нужно изменить настройки проверки или сеанса (и вам не нужно беспокоиться о вашем вопросе).
Начиная с PHP 4.3.3 вызов session_start () после того, как сеанс был ранее запущен, приведет к ошибке уровня E_NOTICE. Кроме того, запуск второго сеанса будет просто проигнорирован.
Из-за вышеперечисленных ответов об ошибках, если сеанс уже запущен, я просто хотел указать, что вы можете сделать:
if (!isset($_SESSION)) { session_start(); }
Тогда, если $ _SESSION уже запущен (установлен), он не будет выполнять функцию запуска.
Хотя нет ничего лучше, чем хорошо структурированный формат файлов и папок с хорошей настройкой структуры. Даже если просто простая структура структуры, которая отделяет бизнес-логику от представления.
Таким образом, у вас будет что-то похожее на конфигурационную папку с инициализационными скриптами или, по крайней мере, включать файлы в какую-то папку, которые включены во все страницы / скрипты.
Затем вы просто имеете свой session_start()
в (в зависимости от вашей установки) либо самый первый файл include, либо в отдельный файл include, а затем включаете этот файл сеанса, когда это необходимо, в определенную область скрипта.
В любом случае вам не нужно называть его в каких-либо других файлах, поскольку вы знаете, что это просто не требуется на основе вашей структуры дизайна.
Если у вас нет файла, который всегда включен, то, по крайней мере, используйте проверку isset()
.
До тех пор, пока вы не получаете доступ или не создаете переменные сеанса, вам не нужно беспокоиться о session_start (). Вам действительно нужно беспокоиться о session_start, если скрипт, который вы используете, создаст переменные сеанса или будет полагаться на доступ к функциям сессионных переменных.
Если файл1 не имеет доступа или создает переменные для использования другими скриптами, тогда не вызывайте его. Если file2, включенный файлом 1, создает или использует переменные в сеансе, тогда file2 должен вызывать session_start (). Файл2 будет включен в сеанс и сможет получить доступ ко всем переменным сеанса, но file1 не будет.
Если вы вызове session_start () в файле1, то файл2 сможет получить доступ ко всем сессионным варам, как если бы он назывался session_start ().
Надеюсь, это еще раз пояснит ситуацию.
Отличный совет от Джеймса с использованием isset. Это предотвратит попытку бессмысленного сеансового вызова.
Также проверьте файл php.ini для session.auto_start var. Если это значение равно 1, все файлы будут запускаться так, как если бы они сделали вызов session_start (). Установите его в 0 в файле php.ini, если вы хотите самостоятельно его контролировать.