Так как PHP на нашем сервере был обновлен до 7,2 с 7,0. Я получаю следующее предупреждение (которое приводит к ошибке), если выполняется новое развертывание. Возможно, причина в том, что старые сеансы становятся недействительными после развертывания.
Предупреждение: session_name (): Невозможно изменить имя сеанса, когда сеанс
активный в /var/www/html/model/login/lib/Session.class.php в строке 137Предупреждение: session_set_cookie_params (): Невозможно изменить куки сеанса
параметры, когда сеанс активен в
/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. К сожалению, также нет ответа: — /
Я сделал отчет об ошибке на php.net, и они объяснили, что это не ошибка. Да, в PHP 7.2 теперь генерируется предупреждение. Однако это никогда не работало как задумано, это просто молча провалилась.
Для создания нескольких сессий необходимо использовать session_id()
, Посмотрите на этот связанный вопрос: PHP Как я могу создать несколько сессий?
session_name()
так же как session_set_cookie_params()
всегда бессмысленны, если сессия уже запущена.
Для оригинального ответа посмотрите здесь: https://bugs.php.net/bug.php?id=75650&спасибо = 2
У меня была похожая проблема, но в конце концов я нашел выход. Код ниже был мой первый подход, который дал мне ошибки.
static function startmysession($lifetime, $path, $domain, $secure, $httponly){
session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly);
session_regenerate_id(true);
if(!isset($_SESSION)){
session_start();
}
}
Более ранние версии php упустили из виду нашу ошибку (мы практически переименовывали и давали сеанс с уже существующими свойствами, что очень неправильно. Итак, как я решил эту проблему?
static function startmysession($lifetime, $path, $domain, $secure, $httponly){
if(!isset($_SESSION)){
session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly);
@session_regenerate_id(true);
session_start();
}
}
Теперь я связал session_set_cookie_params()
незадолго до начала сеанса, и я проверяю, существует ли сеанс, прежде чем сделать это.
У меня php7.2 после обновления, но с установленным mod_php56.
Таким образом, не было никаких проблем после того, как нашел это и заменил на mod_php72.
Надеюсь, это поможет.