我不太确定这里会发生什么,在我搞砸会话数据之前,也许有人可以向我解释。
当用户登录时,我为该用户创建会话。会话使用ini_set('session.save_path',...)
在特殊目录中创建,以防止其他人查看它们。
在页面上,通过Ajax请求调用后台作业来处理某些数据。为此,我需要会话数据(我不需要在会话中写任何东西,只读取)。所以在后台页面中我打电话:
session_start();
$COPY=&$_SESSION;
session_write_close();
$_SESSION=&$COPY;
现在,虽然会话已关闭,但会话数据在整个过程中都可用。
看起来会话在后台作业中关闭后会正常运行。我可以使用会话浏览页面用于其他目的,即使我在后台作业中放置sleep(120);
,主页也不会停止。但我不知道到底发生了什么。
所以,我是对的,后台工作不再使用会话吗?或者PHP在某处创建了一个新会话?以这种方式会话数据是否有任何危险?
答案 0 :(得分:0)
$_SESSION
不会破坏 session_write_close()
。因此,读取会话变量并不需要$COPY=&$_SESSION;
。
调用session_write_close()
后,对$_SESSION
的任何操作都无法用于下一个请求。因此,在session_write_close()
之后无法修改会话数据。
PHP不会在session_write_close()
之后开始新的会话。
示例:如果您不断刷新页面
<pre><?php
session_start();
$_SESSION['t' . time()] = time();
session_write_close();
$_SESSION['p' . time()] = time();
var_export($_SESSION);
?></pre>
您会看到越来越多的t
- 时间戳,但只会看到最后p
- 时间戳。