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

时间:2017-12-07 17:14:40

标签: php session cookies php-7.2

由于我们服务器上的PHP从7.0升级到7.2。如果完成新部署,我会收到以下警告(导致错误)。原因可能是旧会话在部署后无效。

  

警告:session_name():会话时无法更改会话名称   第137行 /var/www/html/model/login/lib/Session.class.php中的活动

     

警告:session_set_cookie_params():无法更改会话Cookie   会话在中处于活动状态时的参数   第138行/var/www/html/model/login/lib/Session.class.php

     

警告:无法修改标头信息 - 已发送的标头   (输出始于   /var/www/html/model/login/lib/Session.class.php:137)in   第142行/var/www/html/model/login/lib/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中引入的。不幸的是,也没有答案: - /

4 个答案:

答案 0 :(得分:8)

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

要创建多个会话,需要使用session_id()。看看这个相关的问题:PHP How can I create multiple sessions?

如果会话已在运行,

session_name()以及session_set_cookie_params()始终是无意义的。

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

答案 1 :(得分:4)

我遇到了类似的问题,但终于找到了解决办法。下面的代码是我的第一个给我错误的方法。

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(),我在测试之前是否已经存在会话。

答案 2 :(得分:1)

TLDR::如果会话存在,请使用setcookie(session_name(), session_id(), ...),否则请使用session_set_cookie_params(...)

https://www.php.net/manual/en/function.session-set-cookie-params.php#100657

  

由于PHP的会话控制无法正确处理会话生存期   当使用session_set_cookie_params()时,我们需要在   以便在用户每次访问我们的网站时更改会话的到期时间   现场。所以,这就是问题所在。

<?php
  $lifetime=600;
  session_set_cookie_params($lifetime);
  session_start();
?>
     

当用户使用以下代码时,该代码不会更改会话的生存期   回到我们的网站或刷新页面。会话将过期   在$ lifetime秒后,无论用户请求多少次   这页纸。因此,我们只需按以下步骤覆盖会话cookie:

<?php
  $lifetime=600;
  session_start();
  setcookie(session_name(),session_id(),time()+$lifetime);
?>
     

现在,我们拥有相同的会话Cookie,其生存期设置为   适当的值。

我的解决方案:

最初:

        $cookieParams = session_get_cookie_params();

        session_set_cookie_params(
            $seconds,
            $cookieParams['path'],
            $cookieParams['domain'],
            $cookieParams['secure']
            );

现在:

        if(isset($_SESSION)) {
            if ($seconds != 0) {
                setcookie(session_name(), session_id(), time() + $seconds);
            } else {
                setcookie(session_name(), session_id(), $seconds);
            }
        } else {
            $cookieParams = session_get_cookie_params();

            session_set_cookie_params(
                $seconds,
                $cookieParams['path'],
                $cookieParams['domain'],
                $cookieParams['secure']
            );
        }

答案 3 :(得分:-2)

升级后我有php7.2,但安装了mod_php56。 因此,找到这个并将其替换为mod_php72之后没有任何问题。 希望有帮助。