Bla*_*bam 16 php cookies session php-7.2
由于我们服务器上的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/login/lib /中发送的标头(在/var/www/html/model/login/lib/Session.class.php:137处开始输出)第142行的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();
}
}
Run Code Online (Sandbox Code Playgroud)
关于会话,PHP有什么变化?
如果另一个会话处于活动状态,为什么不允许设置会话名称(根据具有session_name的文档,我可以更改会话并启动多个会话)?
我怎么可能适当地破坏正在运行的会话?
进一步研究我还在GitHub上找到了以下讨论(https://github.com/Icinga/icingaweb2/issues/3185).他们确认PHP 7.2引入了这个错误.不幸的是,也没有答案: - /
我在php.net上做了一个bug报告,他们解释说这不是一个bug.在PHP 7.2中是,现在生成警告.然而,这从未按预期工作,它只是默默地失败了.
要创建多个会话,需要使用session_id().看看这个相关问题:PHP如何创建多个会话?
session_name()以及session_set_cookie_params()总是nonesense如果会话已在运行.
原始答案请看这里:https://bugs.php.net/bug.php?id = 75650&thanks = 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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,早期版本的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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我绑定了session_set_cookie_params()会话开始之前的内容,并在此之前测试会话是否已经存在。