【发布时间】:2018-05-21 20:55:21
【问题描述】:
由于我们服务器上的 PHP 从 7.0 升级到 7.2。如果完成新部署,我会收到以下警告(这会导致错误)。原因可能是,旧会话在部署后失效。
警告: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()的调用应该遵循相同的逻辑。 -
注释“必须在 session_start 之后调用”与
session_name()的文档相矛盾“你需要在session_start()之前调用session_name()[...]”。我假设此代码从未删除名称为self::$name的会话。 -
@RolandStarke 根据文档 session_name 也可以设置为 SET 或 CHOOSE 当前会话的名称。您可以链接到文档吗,因为我找不到文档记录在哪里?
-
使用way back machine 并尽可能追溯到(2001 年)您可以找到相同的报价。 “[...] 在 session_start() 或 session_register() 之前”。所以我认为它不是一个新功能。也许在以前的版本中它失败了,现在出现了错误。你能关闭当前会话并开始一个新会话吗?喜欢
session_write_close(); session_name(self::$name); session_set_cookie_params(...); session_start();? -
我在升级到 Drupal 7 时遇到了这个问题。其他看到 Drupal 的人可以查看here。
标签: php session cookies php-7.2