Я хочу знать, почему мы вызываем session_start () перед любым другим контентом на веб-странице?
Позвольте мне попытаться описать, как работает протокол 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
?>
Если у вас остались какие-либо вопросы — вы можете задать их в комментариях.
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 должен быть зарегистрирован до начала сеанса.
Как мы знаем, куки хранятся в нашем браузере, а сессии хранятся на сервере. В сессии нет ограничений по размеру.
Для того чтобы решить этот вопрос, мы должны посмотреть, как работает 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 на сервер.
введите описание изображения здесь