PHP Sessions的内部机制

时间:2012-07-12 14:32:32

标签: php session

从手册中,我绘制了当设置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

4 个答案:

答案 0 :(得分:4)

如果符合以下条件,数据将写入文件:

  • session_write_close()被称为
  • 脚本执行完成

所以假设你不做1),你的第二个假设是正确的。

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

答案 1 :(得分:2)

第二个,$_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

答案 2 :(得分:2)

所以,我尝试通过执行以下操作来测试它。

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然后删除 执行test_2.php

结果: test_2.php立即执行,没有冻结(同时test_1.php仍然在睡觉)并打印出一个空数组。



新手结论:

PHP打开与该会话相关的文本文件的流,直到脚本执行完毕,然后“提交”更改。 (我不是专家,所以我的条款可能不准确)

编辑:由于没有咨询the documentation而又是一次无用的测试

  

但是会话数据被锁定以防止并发写入只有一个   脚本可以随时在会话上运行

答案 3 :(得分:-1)

会话将在刷新设置页面后以cookie或任何存储方式编写。例如:

  

有pageA和pageB:

     

在pageA中设置:

     

会话[" foo"] =" bar&#34 ;;

     

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

     

将pageA留给pageB
  或
  离开pageA并刷新pageB

考虑到,最好的定义是恕我直言,第二个。

快乐的编码!