由于我们服务器上的 PHP 从 7.0 升级到 7.2。如果完成新部署,我会收到以下警告(这会导致错误)。原因可能是,旧会话在部署后变得无效。
警告:session_name():在第 137 行的 /var/www/html/model/login/lib/Session.class.php 中的会话处于活动状态时无法更改会话名称
警告:session_set_cookie_params():当会话 在第 138 行的 /var/www/html/model/login/lib/Session.class.php中处于活动状态时,无法更改会话 cookie 参数
警告:无法修改标头信息 - 标头已由 /var/www/html/model/login/lib/Session.class.php:137 中的 /var/www/html/model/login/lib/ 发送第 142 行的 Session.class.php
似乎 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 中引入的。不幸的是也没有答案:-/