4

从手册中,我得出,当设置 php session 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

4 回答 4

4

如果出现以下情况,数据将写入文件:

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

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

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

于 2012-07-12T14:47:48.480 回答
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

于 2012-07-12T14:37:34.937 回答
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,删除PHPSESSIDcookie 然后执行test_2.php

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



新手总结:

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

编辑:由于没有查阅文档,又是一个无用的测试

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

于 2012-07-12T15:06:53.517 回答
-1

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

有 pageA 和 pageB :

在 pageA 中设置:

session["foo"] = "bar";

session["foo"] 只有在以下之后才能对 pageB 可用

离开 pageA 到 pageB

离开 pageA 并刷新 pageB

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

快乐编码!

于 2012-07-12T14:46:15.053 回答