Как повторно открыть сеанс в PHP без получения заголовков уже отправленных предупреждений?
После установки всех сеансовых сессий, которые мне нравятся, я закрываю сессию session_write_close () . Я делаю это, потому что пока сеанс открыт, может быть только одно активное соединение от одного и того же клиента. Но мне нравится иметь несколько параллельных.
Однако, если мне нравится устанавливать другую переменную сеанса в более поздней точке, мне нужно снова открыть сеанс session_start () еще раз. Это работает, но поскольку я уже отправляю код клиенту, он печатает «заголовки, уже отправленные» -warnings. Почему он пытается снова установить cookie? Файл cookie уже установлен. Единственное, что мне нужно – это снова получить доступ к записи файлов сеансов на сервере.
Ну, я могу их подавить. Но есть ли способ возобновить сеанс, который был закрыт session_write_close без повторной отправки заголовка Cookie? Заголовок cookie уже отправлен первым session_start (). Таким образом, второй должен просто вернуть мне доступ к записи файлов сеанса, хранящихся на веб-сервере.
<?php session_start(); // setting all the session vars I like to set session_write_close(); // <-- // To allow parallel requests by the same user, while this script is still running // Code that takes some time to execute // It also prints output, so no more cookie headers after this point @session_start(); // <-- works, but I like to use it without suppressing warnings $_SESSION['key'] = 'new value I like to store'; session_write_close(); ?>
session_start(); ... session_write_close(); ... ini_set('session.use_only_cookies', false); ini_set('session.use_cookies', false); ini_set('session.use_trans_sid', false); ini_set('session.cache_limiter', null); session_start(); // second session_start
Это предотвратит php от вызова php_session_send_cookie()
второй раз.
Смотрите, как работает .
Хотя реструктуризация скриптов по-прежнему кажется лучшим вариантом …
EDIT См. Решение @ VolkerK, это лучше, чем этот.
Просто будьте осторожны с выходом вашего скрипта во время его выполнения, чтобы предотвратить отправку заголовков и вывести его в самом конце:
<?php session_start(); // setting all the session vars I like to set session_write_close(); // Start output buffer ob_start(); // Code that takes some time to execute // Do session stuff at the end of the script session_start(); $_SESSION['key'] = 'new value I like to store'; session_write_close(); // Send output to client ob_end_flush();
Ссылка: функции управления выходом