由于我们服务器上的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中引入的。不幸的是,也没有答案: - /
答案 0 :(得分:8)
我在php.net上做了一个bug报告,他们解释说这不是一个bug。 是的,在PHP 7.2中现在会生成警告。但是这从未按预期工作,只是默默地失败。
要创建多个会话,需要使用session_id()
。看看这个相关的问题:PHP How can I create multiple sessions?
session_name()
以及session_set_cookie_params()
始终是无意义的。
答案 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之后没有任何问题。 希望有帮助。