PHP 会话的内部机制



从手册中,我得出,当设置php会话var时,它会被写入session_save_path文件夹中的文本文件。

我只是想知道这是在解释器到达会话变量行时发生的,还是在PHP解释器退出处理文件时发生的(写入文本文件)?

例如,如果我要在连续的两行中设置和更新会话变量(如下面给出的示例中所示),PHP解释器是否会将文件背靠背保存两次?

换句话说,哪些代码片段具有正确的注释?

$_SESSION['my_variable']=1; // writes to the session text file
$_SESSION['my_variable']=2; // writes to the session text file again
die();                      //   
versus 
$_SESSION['my_variable']=1; // updates the session file contents in the memory
$_SESSION['my_variable']=2; // updates the session file contents in the memory
die();                      // writes to the session text file

如果:,则将数据写入文件

  • session_write_close()被调用
  • 脚本执行完成

因此,如果你不这样做,你的第二个假设是正确的。

每次变量更改时写入文件都会非常昂贵,因为一般来说,访问和写入磁盘的速度很慢,因此PHP不会这么做。然而,应该注意的是,缓存系统(如memcache或redis)会在更改发生时存储更改,因此当PHP会话在可靠性方面不够时,依赖它们可能是一个好主意。

第二个,$_SESSION[...] = ...,他们只是在$_SESSION数组中设置值,die()触发此函数:

session_write_close

(PHP 4>=4.0.4,PHP 5)

session_write_close—写入会话数据并结束会话

报告错误描述

void session_write_close(void)结束当前会话并存储会话数据。

会话数据通常在脚本终止后存储需要调用session_write_close(),但由于会话数据被锁定为了防止并发写入,一个会话上只能操作一个脚本任何时候。将框架集与会话一起使用时由于这种锁定,体验帧一个接一个地加载。你可以通过将会话结束为,减少加载所有帧所需的时间一旦完成对会话变量的所有更改。

http://nl.php.net/manual/en/function.session-write-close.php

因此,我尝试通过以下操作进行测试。

test_1.php

session_start();
$_SESSION['my_variable']=1;
sleep(20);
exit;

test_2.php

session_start();
var_dump($_SESSION);

以下是我测试的案例:

  • 执行test_1.php,然后快速执行test_2.php

结果:test_2.php冻结至test_1.php睡眠结束。

  • 执行test_1.php,删除PHPSESSID cookie,然后执行CCD_ 13

结果:test_2.php立即执行,没有冻结(在此期间test_1.php仍在休眠),并打印一个空数组。



新手结论:

PHP打开一个流到与该会话相关的文本文件,直到脚本完成执行,然后"提交"更改。(我不是专家,所以我的术语可能不准确)

编辑:由于未查阅文档,又进行了一次无用的测试

但由于会话数据被锁定以防止并发写入,因此只有一个脚本可以在任何时候对会话进行操作

只有在刷新setter页面后,会话才会写入cookie或您选择的任何存储中。例如:

具有页面A和页面B:

页面A中的设置:

session["foo"]="bar";

会话["foo"]只有在:之后才可用于pageB

离开页面A到页面B

离开页面A并刷新页面B

考虑到这一点,IMHO的最佳定义是第二个。

编码快乐!

最新更新