PHP session_write_close () продолжает отправлять заголовок set-cookie - PullRequest
2 голосов
/ 27 февраля 2011

В моем фреймворке я делаю несколько вызовов session_write_close ().

Предположим, что сеанс был инициирован агентом пользователя.Следующий код ...

foreach($i = 0; $i < 3; $i++) {
    session_start();
    session_write_close();
}

... отправит в браузер следующий заголовок запроса:

Set-Cookie    PHPSESSID=bv4d0n31vj2otb8mjtr59ln322; path=/
              PHPSESSID=bv4d0n31vj2otb8mjtr59ln322; path=/

Не должно быть заголовка Set-Cookie, потому что, как я предусмотрелфайл cookie сеанса уже создан на стороне пользователя.Но каждый вызов метода session_write_close () после первого в приведенном выше сценарии приводит к тому, что PHP инструктирует браузер заново установить текущий сеанс.

Это не нарушает работу моего приложения или чего-либо еще, но раздражает.Кто-нибудь понимает, что PHP не может переустанавливать cookie при каждом последующем обращении к session_write_close?

EDIT

Кажется, проблема в том, что при каждом последующем вызовев методе session_start () PHP переустанавливает cookie-файл сеанса на свой собственный SID и отправляет заголовок ответа Set-Cookie.Но почему ??

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

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

0 голосов
/ 17 января 2015

Почти каждый ответ, который я нашел на SO, говорит просто делать session_write_close() и session_start() снова и снова ... некоторые даже временно отключают куки с ini_set ... это кажется очень плохим подходом. Авторы PHP предоставили очень четкий, лучший метод, чтобы внедрить свой собственный способ обработки сессий, используя session_set_save_handler.

Я создал пример для другого поста, который показывает, как вы можете заменить session_start() на Session::start() и заменить session_write_close() на Session::save(). Этот класс является неблокирующим (пользователь может иметь одновременные запросы) класс, реализованный для PHP 5.4+. На самом деле это всего лишь измененная версия примера класса PHP.

Хотя мой пример - PHP 5.4+, этот же метод работает в старых версиях PHP с методами обратного вызова вместо реализации интерфейса.

https://stackoverflow.com/a/27993746/482256

0 голосов
/ 27 февраля 2011

session_write_close, просто закройте сессию и запишите данныепока session_start отправляет кукиесли вы не хотите отправлять сессионный cookie, вы не должны вызывать session_start

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...