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行 警告:无法修改标题信息-标题已由发送 (输出开始于 /var/www/html/model/login/lib/Session.class.php:137) /var/www/html/model/login/lib/Session.class.php,第142行 似乎PHP7.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
/**
* 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);
?>