读取session_write_close后的会话变量


Reading session variables after session_write_close

首先是我的具体问题。这应该起作用吗?

<?php 
    session_start();
    $_SESSION['test']='TEST_CONTENT';
    echo '1: ',$_SESSION['test'];
    echo '<br>';
    session_write_close();
    echo '2: ',$_SESSION['test']
?>

现在,一些背景信息。我们有一个带有框架集的web应用程序(不要让我开始…不,没有钱来改变这一点),我们发现在某些情况下,我们的SESSION变量没有被写入数据库!经过一些艰苦的测试,我们发现两个帧同时加载,虽然这种情况几乎从未发生过,但第一个调用的帧在第二个调用后完成。第一个调用的帧用先前创建的副本覆盖会话(因为在脚本结束时它会写入会话)。

我们现在的解决方案是尝试在第一次调用的帧上尽快调用session_write_close(),但我们担心仍然能够读取会话变量(100%确定)

考虑一下,你可以用另一种方式实现它。

如何实现它很简单

session_start();
$_SESSION['timestamp'] = time();

这将放在你的脚本的上面。

当脚本停止时,它将被保存到您的数据库中,但是等待停止,我们还没有完成:p

然后检查当前记录中的时间戳是高还是低。如果它较低,那么更新,否则忘记更新,什么都不做。应该考虑microtime()。因为人们喜欢按f5。

这是一个新想法,我认为它的效果更好,更节省生产成本


回答评论:

查看session handler,你可以创建自己的函数来处理session。所以你不需要重构你的代码,只需要添加。

然后在写部分,你告诉数据库更新id为x且时间戳高于给定值的记录。

对于实现,您应该在记录timestamp/mincrotime中添加一列。在会话处理程序中,你节省了请求的时间。所以你可以做比较。那么您也不需要在会话中节省时间:)(不是在$_SESSION中,它保存在db中!)