Подтвердить что ты не робот

Повторное открытие сеанса в PHP

Как повторно открыть сеанс в 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();
?>
4b9b3361

Ответ 1

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().
Посмотрите, как работает.

Хотя реструктуризация скриптов по-прежнему кажется лучшим вариантом...

Ответ 2

EDIT См. решение @VolkerK, это лучше, чем этот.

Просто будируйте вывод своего script, пока он выполняется, чтобы предотвратить отправку заголовков и выводить его в самом конце:

<?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();

Ссылка: Функции контроля вывода