我现在正在使用php,当我启动会话时,我使用read_and_close标志设置为true,这是因为在我们的系统中我们主要只是执行读取。另外我可以说当我们想要在我们的只读会话中添加/更新或删除数据时,我们有使用session_start和session_write_close的函数。
问题在于它主要起作用,但有时候(非常随机地发生)它只是被摧毁而用户正在退出。
这在任何随机时间都会发生,但我还可以补充一点,系统主要用于ajax请求。删除read_and_close标志会使问题消失。
答案 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分钟运行一次)将不会在这些会话文件上看到任何活动,并且会假定它们已过时而将其过早删除。
(我想说这种“不接触”的行为有点像docs对read_and_close
的暗示,但是它可能引起的微妙之处是微不足道的,违反直觉的,甚至可能适得其反的,所以这明确记录也将是一件好事。)