PHP 7.2 警告:“会话处于活动状态时无法更改会话名称”

2022-08-30 17:49:50

由于我们服务器上的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/lib/Session 中 (输出从 /var/www/html/model/login/lib/Session.class.php:137 开始.class.php第 142 行的标头

似乎 PHP 7.2 在会话罪的上下文中变得更加严格。服务器似乎识别出无效的会话并尝试销毁这些会话。这是会话类的一部分:

/**
 * 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 中引入的。不幸的是,也没有答案:-/


答案 1

我在 php.net 做了一个错误报告,他们解释说这不是一个错误。是的,在 PHP 7.2 中,现在会生成一个警告。然而,这从未按预期工作,它只是默默地失败了

要创建多个会话,需要使用 。看看这个相关的问题: PHP 如何创建多个会话?session_id()

session_name()以及如果会话已经在运行,则始终无意义。session_set_cookie_params()

对于原始答案,请看这里:https://bugs.php.net/bug.php?id=75650&thanks=2


答案 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()


推荐