Поскольку PHP на нашем сервере был обновлен до 7.2 с 7.0. Я получаю следующее предупреждение (которое приводит к ошибке), если выполняется новое развертывание. Причина, вероятно, в том, что старые сеансы становятся недействительными после развертывания.
Предупреждение: session_name (): Невозможно изменить имя сеанса, когда сеанс активен в /var/www/html/model/login/lib/Session.class.php в строке 137
Предупреждение: session_set_cookie_params (): Невозможно изменить параметры cookie сеанса, когда сеанс активен в /var/www/html/model/login/lib/Session.class.php в строке 138
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с /var/www/html/model/login/lib/Session.class.php:137) в / var / www / html / model / login / lib / Session.class.php в строке 142
Похоже, что PHP 7.2 стал более строгим в контексте сеанса в определенном контексте. Сервер, кажется, распознает недействительные сеансы и пытается их уничтожить. Это часть класса Session:
/**
* Secure instant destruction of session. Must be called after session_start !
*/
public static function destroyAbsolute() {
self::checkInit(); // unimportant
session_name(self::$name); // this is line 137
session_set_cookie_params(0, COOKIEPATH, null, self::$force_ssl_cookie, true);
if(session_id()) {
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), "", time() - 42000, COOKIEPATH);
}
unset($_COOKIE[session_name()]);
session_destroy();
}
}
Что изменилось в PHP относительно сессий?
Почему нельзя установить имя сеанса, если другой сеанс активен (в соответствии с документами с session_name я могу изменить сеансы и начать несколько сеансов)?
И как я могу соответствующим образом уничтожить запущенный сеанс?
В ходе дальнейшего исследования я также нашел следующее обсуждение на GitHub (https://github.com/Icinga/icingaweb2/issues/3185). Они подтверждают, что эта ошибка возникла в PHP 7.2. К сожалению, ответа тоже нет: - /
if(session_id()) {}
предполагает, чтоdestroyAbsolute()
ожидает, что несколько разsession_start()
был вызван, а иногда нет. Ваш вызовsession_name()
должен следовать той же логике. - person Álvaro González   schedule 07.12.2017session_name()
, вам нужно вызватьsession_name()
[...] передsession_start()
. Я предполагаю, что этот код никогда не удалял сеанс с именемself::$name
. - person Roland Starke   schedule 07.12.2017var_dump()
'ing прочего, чтобы узнать, что происходит, а что нет. - person Funk Forty Niner   schedule 07.12.2017session_write_close(); session_name(self::$name); session_set_cookie_params(...); session_start();
? - person Roland Starke   schedule 08.12.2017