我在理解PHP的会话时遇到了一些麻烦。首先,我将会话数据保存在数据库中,我使用PHP的session_set_save_handler()
函数来定义它。
我理解PHP将会话数据保存到数据库时的方式如下:
如果我定义了一些会话变量,然后将一些文本输出到用户的浏览器,我相信在输出文本之前,会话数据不会保存到DB。请看这段代码:
$_SESSION['username'] = $username;
//check if session variable set
if($_SESSION['username'] != $username)
{
die('error...');
}
在代码中,if语句返回false,因此die()
永远不会发生。此外,PHP在if语句之后才会将会话数据写入DB。我不明白的是,如果会话数据尚未写入数据库,那么PHP如何将$_SESSION['username']
与$username
进行比较?当会话数据写入数据库时,$_SESSION['username']
是否存储在服务器内存中,直到脚本结束?
感谢您的时间。
答案 0 :(得分:2)
完全正确。
会话数据保留在内存中直到请求结束(或直到调用session_write_close())。然后将$ _SESSION的内容写入配置的存储机制。
在下一个请求中,当session_start()发生时,数据将从存储器加载到$ _SESSION,并保留,直到请求完成。
否则,每次触及会话中的任何内容时,PHP都会读取/写入数据库(在您的情况下)。
答案 1 :(得分:2)
_SESSION是一个“普通”数组,就像$a = array()
一样
只有当调用session_start()并且先前存储的数据被读取(返回)到_SESSION并且会话机制停止时(当php实例关闭或者调用session_write_close()时)和_SESSION中的数据是序列化和存储。
答案 2 :(得分:1)
您可以使用session_write_close强制php编写会话。
见: http://us2.php.net/manual/en/function.session-write-close.php