【问题标题】:ini_set fails to set session variables – PHP 7.2.0 and higherini_set 无法设置会话变量 - PHP 7.2.0 及更高版本
【发布时间】:2018-06-20 22:43:32
【问题描述】:

这是gc_maxlifetime 的示例,但它不适用于我尝试过的session. 变量

<?php
session_start();
ini_set('session.gc_maxlifetime', 1500);

这在 PHP 7.2.0 之前一直有效,现在抛出这个警告:

警告:ini_set():会话处于活动状态。您不能更改会话 此时模块的ini设置在第3行的/in/nOv0L中

https://3v4l.org/nOv0L

我检查了changelog,但找不到原因。

谁能告诉我发生了什么变化,以及如何解决它?


附言我知道我可以这样做:

 ini_set('session.gc_maxlifetime', 1500);
 session_start();

但这并不是我的问题的重点。

【问题讨论】:

  • 7.2 中的 PHP 开发人员添加了此警告。在此之前,此代码执行相同操作,但没有警告。如下所示,如果在 start_session 之后调用,则会出现错误。

标签: php php-7.2


【解决方案1】:

即使没有警告,在会话开始后更改设置也不会产生任何效果。

manual

在会话开始期间可能会发生垃圾收集

因此,如果您在启动会话后更改该值,它将无效。对于大多数其他会话参数也是如此。

您可能遇到的是其他更改的人工制品,例如将此消息添加为警告(我发现的所有其他来源,例如 Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time 仅将其作为没有关联级别的“消息”提及)。

【讨论】:

  • "在此上下文中的含义是任何保存时间超过 gc_maxlifetime 的存储会话都应该被删除。" (symfony docs)。那么在会话开始后更改值会产生影响,还是我误解了什么?
  • 第一句说明这是在会话打开时完成的。更改值不会触发垃圾收集器,因此不会根据新设置收集任何会话
  • 啊,我明白了。我刚刚意识到我并没有真正掌握 gc 的工作原理。谢谢你:)
【解决方案2】:

好吧,在开始会话之前进行所有配置更改:

ini_set('session.gc_maxlifetime', 1500);
session_start();

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 2014-04-03
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多