当read_and_close处于活动状态时,PHP会话随机死亡

时间:2016-06-13 11:53:35

标签: php session

我现在正在使用php,当我启动会话时,我使用read_and_close标志设置为true,这是因为在我们的系统中我们主要只是执行读取。另外我可以说当我们想要在我们的只读会话中添加/更新或删除数据时,我们有使用session_start和session_write_close的函数。

问题在于它主要起作用,但有时候(非常随机地发生)它只是被摧毁而用户正在退出。

这在任何随机时间都会发生,但我还可以补充一点,系统主要用于ajax请求。删除read_and_close标志会使问题消失。

2 个答案:

答案 0 :(得分:1)

根据我的测试,即使设置了读取和关闭标志,您仍然可以写入会话。我没有问题:

const SESSION = [
'name' => 'my_session_name',
'storage' => 'default',
    'options' => [
        'read_and_close' => true,
        'cookie_lifetime' => false,
        'use_strict_mode' => true,
        'use_only_cookies' => 1,
        'cookie_httponly' => 1,
        'use_trans_sid' => 0,
        //Ensure this is true for production:
        'cookie_secure' => false
    ],
];

session_name(SESSION['name']);
session_start(SESSION['options']);

//index.php:
$_SESSION['blah'] = 33;
var_dump($_SESSION);//: Shows newly added variable

var_dump(session_status());//: int: 1

答案 1 :(得分:1)

session_start(['read_and_close' => true]) 不会更新会话文件的时间戳。

我不确定PHP自己的内部GC如何处理此问题(我认为不是),但是如果您使用的是Debian(或Ubuntu等),则使用自定义垃圾收集器脚本(每30分钟运行一次)将不会在这些会话文件上看到任何活动,并且会假定它们已过时而将其过早删除。

(我想说这种“不接触”的行为有点像docsread_and_close的暗示,但是它可能引起的微妙之处是微不足道的,违反直觉的,甚至可能适得其反的,所以这明确记录也将是一件好事。)