$ _COOKIE , похоже, не отражает изменений после установки

Я не помню, чтобы у меня было много проблем с использованием Cookies в прошлом, но я играл и сталкивался с неожиданными результатами.

(я работаю на локальном хосте, следовательно, моя настройка домена)

<?php $sessionCookie = rand(); setcookie("crav_auto_login_cookie", $sessionCookie, false,"/crav/", false); echo "Cookie Set<br/>"; echo "Cookie equals: ".$_COOKIE["crav_auto_login_cookie"]."<br/>"; echo "should equal: ". $sessionCookie; ?> 

Это даст следующий результат:

Cookie Set
Cookie equals: 457718770
should equal: 318511886

Я, очевидно, что-то пропустил, но не знаю, почему значения разные. Это потому, что файлы cookie загружаются при вызове страницы, а $_COOKIE["crav_auto_login_cookie"] возвращает результаты из экземпляра, вызванного при открытии страницы и не отражая вновь установленное значение? Если это так, то почему?

setcookie устанавливает заголовки для отправки обратно клиенту, чтобы установить файл cookie. Новый файл cookie не будет доступен в массиве $_COOKIE (который содержит файлы cookie, отправленные с клиента) до следующего запроса.

Ниже приведен упрощенный ход событий, когда пользователь обращается к вашей странице:

  1. Браузер пользователя отправляет запрос на ваш сервер. Этот запрос содержит заголовки, включая файлы cookie для этого пользователя для вашего домена. PHP заполняет $_COOKIE (а также $_GET , $_POST и т. Д.) На основе данных в этом запросе.
  2. Сервер анализирует запрос пользователя и устанавливает ответ . Этот ответ начинается с заголовков ответов (включая любые заголовки, которые вы setcookie себе через header , а также заголовки для файлов cookie, установленные через setcookie ). Все заголовки должны предшествовать выводам любой страницы (как вы могли столкнуться, PHP даст вам сообщение об ошибке, если вы попытаетесь отправить больше заголовков после того, как вы начали выводить содержимое страницы).
  3. Сервер отправляет содержимое страницы (на самом деле заголовки и контент являются частью одной и той же передачи).
  4. Соединение между сервером и клиентом закрывается (давайте проигнорируем AJAX для целей этого обсуждения).
  5. Клиент анализирует полученные заголовки и контент, устанавливает куки-файлы по мере необходимости и отображает страницу (на самом деле это может произойти в последовательности с получением страницы).

Таким образом, к тому времени, когда заголовок set-cookie будет получен и обработан клиентом, клиент уже выполнит связь с сервером, поэтому cookie не будет отображаться в PHP до следующего запроса.

Из документации setcookie от PHP.net в разделе «Общие ошибки»:

Куки-файлы не станут видимыми до следующей загрузки страницы, на которой должен отображаться файл cookie. Чтобы проверить, был ли файл cookie успешно установлен, проверьте, будет ли файл cookie на следующей странице загрузки до истечения срока действия файла cookie.

вы можете напрямую переписать суперглобал.

$ sessionCookie = rand ();
setcookie ("crav_auto_login_cookie", $ sessionCookie, false, "/ crav /", false); $ _COOKIE ["crav_auto_login_cookie"] = $ sessionCookie;

echo "Cookie Set";
echo "Cookie equals:". $ _ COOKIE ["crav_auto_login_cookie"];
эхо "должно быть равно:". $ SessionCookie;