Intereting Posts
php foreach loop и кнопка addmore в форме Однострочный генератор случайных строк PHP? Инициализация статической переменной в PHP Symfony Bundle: как избежать использования __DIR__ для построения пути к сопоставлениям Doctrine Как я могу обмениваться контентом со своей внутренней страницы на странице Facebook? Ошибка подключения к PHP: SQLSTATE Соединение отклонено Проблемы MySQL с запросом MySQL Отправить значение текстового поля в PHP MySQL с помощью xcode 8 (Objective-c) с действием или кликом? Почему модуль php_oauth.dll не работает в Windows 7? Как отображать результаты из базы данных во входную область? загрузка кодаигнита не работает на linux Данные заказа, основанные на подсчете связанных данных таблицы Быстрее или лучше использовать MySQL вместо текстовых файлов или имен файлов для порядка изображений с PHP? Нет файлов cookie с php cURL Отправка переменных в URL-адресах в PHP с помощью эха

php session_start с включенными файлами

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

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 каждый раз, когда я хотел бы использовать переменную сеанса).

  1. Вы должны начать сеанс только один раз. В вашем примере просто нужно session_start () в первой строке page.php
  2. session_start () будет генерировать E_NOTICE, если сеанс был ранее запущен. Вы можете использовать @session_start (), чтобы игнорировать его.
  3. Он также генерирует E_NOTICE, если вы используете session_start () после вывода HTML-кода.

Я бы рекомендовал создать файл 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, если вы хотите самостоятельно его контролировать.