Почему мы вызываем session_start() перед любым другим содержимым веб-страницы?

Я хочу знать, почему мы вызываем session_start() перед любым другим содержимым веб-страницы?


person Binura Dodangoda    schedule 26.06.2016    source источник
comment
использовать SESSION на этой странице   -  person Anant Kumar Singh    schedule 26.06.2016


Ответы (3)


Позвольте мне попытаться описать, как работает протокол HTTP.

Запрос из браузера выглядит так:

GET /somefolder/somescript.php HTTP/1.1
Host: www.yourhost.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Your_Useragent
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp;q=0.8
Referer: http://testreferer.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,bg;q=0.2
Another-Header: Value1
Another-Header1: Value2

А запрос с сервера выглядит примерно так:

HTTP/1.1 200 OK
Cache-Control: max-age=21600
Strict-Transport-Security: max-age=15552000; includeSubdomains; preload
Content-Security-Policy: upgrade-insecure-requests
Some-Other-Header: Value1
And-Another-Header: Value2\n\n
<YOUR WEBPAGE CONTENTS>

Итак, первый сервер отправляет заголовки и \n\n в конце, и только потом начинает отправлять содержимое вашей веб-страницы. Но session_start() отправляет "свои" заголовки, но вы не можете отправлять заголовки, когда они уже закончили отправку!

Пример:

<?php
Header("SomeCoolHeader: Value1"); //Sending custom headers
session_start(); //Sending session header
Header("AnotherHeader: Value2"); //Sending custom headers

echo "Some text"; //Header sending automatically finished and sent some html text
?>

Пример 2 (с ошибкой):

<?php
Header("CustomHeader1: Value1"); //sending custom headers

echo "Some text"; //Header sending automatically finished and sent some html text

Header("CustomHeader2: Value2"); //Cannot add header information - headers already sent
?>

Пример 3 (с ошибкой):

<?php
Header("CustomHeader1: Value1"); //sending custom headers

echo "Some text"; //Header sending automatically finished and sent some html text

session_start(); //Cannot add header information - headers already sent
?>

Если у вас остались вопросы - вы можете задать их мне в комментариях.

person NulledCoder    schedule 26.06.2016

session_start() создает сеанс или возобновляет текущий на основе идентификатора сеанса, переданного через запрос GET или POST, или переданного через файл cookie.

При вызове session_start() или при автоматическом запуске сеанса PHP вызывает обработчики сохранения сеанса открытия и чтения. Это будет либо встроенный обработчик сохранения, предоставляемый по умолчанию, либо расширения PHP (такие как SQLite или Memcached); или может быть настраиваемым обработчиком, как определено в session_set_save_handler(). Обратный вызов чтения извлечет любые существующие данные сеанса (хранящиеся в специальном сериализованном формате) и будет десериализован и будет использоваться для автоматического заполнения суперглобального массива $_SESSION, когда обратный вызов чтения возвращает сохраненные данные сеанса обратно в обработку сеанса PHP.

Чтобы использовать именованный сеанс, вызовите session_name() перед вызовом session_start().

Когда session.use_trans_sid включен, функция session_start() регистрирует внутренний обработчик вывода для перезаписи URL.

Если пользователь использует ob_gzhandler или аналогичный с ob_start(), порядок функций важен для правильного вывода. Например, ob_gzhandler должен быть зарегистрирован до начала сеанса.

person Community    schedule 26.06.2016

Как мы знаем, файлы cookie хранятся в нашем браузере, а сеансы хранятся на сервере. В сеансе нет ограничений по размеру. Чтобы ответить на этот вопрос, мы должны посмотреть, как PHP работает внутри. Посмотрите в файле php.ini, вы можете увидеть что-то вроде ниже под сеансом,

[Session]
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0

Поскольку в конфигурации по умолчанию php хранит сеанс в виде файла на сервере, путь по умолчанию — «/ tem». В tmp вы можете увидеть файлы с именами типа «sess_4b1e384ad74619bd212e236e52a5a174If», это только один файл сеанса. В обычном сценарии к одной и той же сети одновременно обращается множество пользователей. Потом таких файлов в папке tmp много. В то время как php создает файл в папке tmp, php устанавливает файл cookie в браузере клиентов как PHPSESSID в качестве имени и значения. Этот файл cookie показан на изображении ниже. введите здесь описание изображения

С каждым запросом браузер отправляет этот файл cookie на сервер. введите здесь описание изображения

person Chathura Madhushanka    schedule 06.07.2016