从手册中,我绘制了当设置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
答案 0 :(得分:4)
如果符合以下条件,数据将写入文件:
所以假设你不做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
考虑到,最好的定义是恕我直言,第二个。
快乐的编码!