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

PHP 7.2警告:“;会话处于活动状态时无法更改会话名称";,php,session,cookies,php-7.2,Php,Session,Cookies,Php 7.2,因为我们服务器上的PHP从7.0升级到了7.2。如果进行了新的部署,我将收到以下警告(这将导致错误)。原因可能是,旧会话在部署后变得无效 警告:会话名称():无法在会话启动时更改会话名称 在第137行的/var/www/html/model/login/lib/Session.class.php中激活 警告:会话设置cookie参数():无法更改会话cookie 会话在中处于活动状态时的参数 /var/www/html/model/login/lib/Session.class.php,第138

因为我们服务器上的PHP从7.0升级到了7.2。如果进行了新的部署,我将收到以下警告(这将导致错误)。原因可能是,旧会话在部署后变得无效

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

警告:会话设置cookie参数():无法更改会话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行

似乎PHP7.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中,会话发生了什么变化

如果另一个会话处于活动状态,为什么不允许设置会话名称(根据具有会话名称的文档,我可以更改会话并启动多个会话)

如何适当地销毁正在运行的会话


通过进一步的研究,我还发现了以下关于GitHub()的讨论他们确认此错误是由PHP7.2引入的。不幸的是,也没有答案:-/

我在php.net上做了一个bug报告,他们解释说这不是bug。是的,在PHP7.2中,现在会生成一个警告。然而,这并没有达到预期的效果,它只是默默地失败了

要创建多个会话,需要使用
session\u id()
。看看这个相关的问题:

如果会话已在运行,
session\u name()
以及
session\u set\u cookie\u params()
始终是无意义的


请看这里的原始答案:

我也遇到了类似的问题,但最终找到了解决方法。下面的代码是我第一次遇到错误的方法

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();
         }    
    }

现在,我在会话开始之前绑定了
会话\u集\u cookie \u参数()
,并在此之前测试会话是否已经存在。

TLDR:如果会话存在,请使用
设置cookie(会话名称(),会话id(),…)
否则使用
会话设置\u cookie\u参数(…)

因为PHP的会话控件不能正确处理会话生存期 当使用session_set_cookie_params()时,我们需要在 每次用户访问我们的服务器时更改会话到期时间 所以,问题出在这里

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

if(isset($\会话)){
如果($s!=0){
setcookie(会话名称(),会话id(),时间()+$seconds);
}否则{
setcookie(会话名称(),会话id(),$seconds);
}
}否则{
$cookieParams=会话获取cookie参数();
会话设置cookie参数(
$s,
$cookieParams['path'],
$cookieParams['domain'],
$cookieParams['secure']
);
}

if(session\u id()){}检查表明,
destroy absolute()
期望某些时候调用了
session\u start()
,有些时候没有调用。然后,对
session\u name()
的调用应该遵循相同的逻辑。注释“必须在session\u start之后调用”对
session\u name()
“您需要在
session\u start()
之前调用
session\u name()
[…]的文档进行对比。”。我假设此代码从未删除名为“
self::$name
@RolandStarke”的会话。根据文档会话,还可以将名称设置为设置或选择当前会话的名称。由于我找不到记录此会话的位置,您能链接到文档吗?使用并尽可能追溯(2001)你可以在session_start()或session_register()之前找到相同的引号“[…”。因此我认为这不是一个新功能。可能在以前的版本中,它失败了,现在出现了一个错误。你能关闭当前会话并启动一个新会话吗?比如
session_write_close();session_name(self:$name);session_设置_cookie_参数(…);session_start();
?我在升级到Drupal 7时遇到了这个问题。任何其他看到Drupal的人都可以查看。
<?php
  $lifetime=600;
  session_start();
  setcookie(session_name(),session_id(),time()+$lifetime);
?>