php session_start с включаемыми файлами - PullRequest
8 голосов
/ 02 августа 2011

Я многое узнал о начале сессии из моего предыдущего вопроса . Теперь мне интересно, как происходит блокировка сеанса, когда файлы включены в другие файлы. Допустим, у меня есть:

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, становится ли сеанс разблокированным, как только будет сделан header.php? или он работает в течение всей жизни page.php, поэтому сеанс sub_page блокируется? Нужно ли session_start в sub_page? Будет ли лучше практиковать, если я session_write_close каждый раз, когда я закончу с данными сеанса? (Хотя это будет означать session_start каждый раз, когда я хотел бы использовать переменную сеанса).

Ответы [ 5 ]

10 голосов
/ 02 августа 2011

Я бы порекомендовал создать файл session.php, который вы бы включили один раз в первой строке каждой страницы.Таким образом, сеанс обрабатывается в ОДНОМ файле, если вам нужно изменить параметры проверки или сеанса (и вам не нужно беспокоиться о вашем вопросе).

9 голосов
/ 02 августа 2011
  1. Вы должны начать сессию только один раз. В вашем примере просто нужно использовать session_start () в первой строке page.php
  2. session_start () сгенерирует E_NOTICE, если сессия была начата ранее. Вы можете использовать @session_start (), чтобы игнорировать его.
  3. Он также генерирует E_NOTICE, если вы используете session_start () после вывода HTML-кода.
7 голосов
/ 24 февраля 2014

Из-за приведенных выше ответов об ошибках, если сессия уже началась, я просто хотел отметить, что вы можете сделать:

if (!isset($_SESSION))
  {
    session_start();
  }

Тогда, если $ _SESSION уже запущен (установлен), он не будет выполнятьфункция запуска.

Хотя нет ничего лучше, чем хорошо структурированный макет файла и папки с хорошей настройкой фреймворка.Даже если это простая структура фреймворка, которая отделяет бизнес-логику от представления.

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

Тогда у вас просто есть session_start() в (в зависимости от вашей настройки) либо самый первый включаемый файл, либо в отдельный включаемый файл, а затем включите этот файл сеанса, когда это необходимо, в определенную область скрипта.

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

Если у вас нет файла, который всегда включен, то, по крайней мере, используйте проверку isset().

6 голосов
/ 02 августа 2011

Начиная с PHP 4.3.3, вызов session_start () после того, как сеанс был ранее запущен, приведет к ошибке уровня E_NOTICE.Кроме того, начало второго сеанса будет просто игнорироваться.

1 голос
/ 28 августа 2016

Пока вы не обращаетесь к переменным сеанса и не создаете их, вам не нужно беспокоиться о session_start ().Вам действительно нужно беспокоиться о session_start, если скрипт, который вы запускаете, будет создавать переменные сеанса или полагаться на доступ к переменным сеанса для работы.

Если file1 не обращается или не создает переменные для использования другими сценариями, тогда не 'не могу это назвать.Если file2, включенный в file1, создает или использует переменные в сеансе, то file2 должен вызвать session_start ().Файл 2 будет включен в сеанс и будет иметь доступ ко всем переменным сеанса, но файл 1 не будет.

Если вы вызовите session_start () в файле1, то файл 2 сможет получить доступ ко всем переменным сеанса, как если бы онnamed session_start ().

Надеюсь, это немного прояснит ситуацию.

Отличный совет от Джеймса по использованию isset.Это предотвратит попытку бессмысленного сеансового вызова.

Также проверьте ваш файл php.ini на предмет session.auto_start var.Если для этого параметра установлено значение 1, все файлы будут запускаться так, как если бы они выполняли вызов session_start ().Установите значение 0 в файле php.ini, если хотите сами управлять им.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...