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

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

-1

Решение

Позвольте мне попытаться описать, как работает протокол 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
?>

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

1

Другие решения

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 должен быть зарегистрирован до начала сеанса.

0

Как мы знаем, куки хранятся в нашем браузере, а сессии хранятся на сервере. В сессии нет ограничений по размеру.
Для того чтобы решить этот вопрос, мы должны посмотреть, как работает 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 store по умолчанию в виде файла на сервере, путь по умолчанию — «/ tem». В tmp вы можете видеть файлы с именами, такими как «sess_4b1e384ad74619bd212e236e52a5a174If», это только один файл сеанса. В обычном сценарии множество пользователей одновременно получают доступ к одной и той же сети. Тогда есть много таких файлов в папке TMP. Когда php создает файл в папке tmp, php устанавливает в браузере клиента cookie как PHPSESSID в качестве имени и значения. Этот файл cookie показан на изображении ниже.
введите описание изображения здесь

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

0
По вопросам рекламы [email protected]