【问题标题】:Using reference to session data使用对会话数据的引用
【发布时间】:2013-11-29 03:21:18
【问题描述】:

我不太确定这里发生了什么,在我搞砸我的会话数据之前,也许有人可以向我解释一下。

当用户登录时,我为该用户创建一个会话。会话是使用ini_set('session.save_path',...) 在特殊目录中创建的,以防止其他人查看它们。

在页面上,通过 Ajax 请求调用后台作业来处理一些数据。为此,我需要会话数据(我不需要在会话中写任何东西,只需要读取)。所以在后台页面我调用:

session_start();
$COPY=&$_SESSION;
session_write_close();
$_SESSION=&$COPY;

现在,虽然会话关闭了,但会话数据在整个过程中都是可用的。

看起来会话在后台作业中关闭后表现正常。我可以出于其他目的使用会话浏览页面,即使我在后台作业中放置了sleep(120);,主页也不会停止。但我不知道到底发生了什么。

那么,后台作业不再使用会话是否正确?还是 PHP 在某处创建一个新会话?以这种方式损坏会话数据是否有任何危险?

【问题讨论】:

  • 如果会话仍然可以写入,而我在其他地方调用它,PHP 将等到会话关闭。

标签: php session


【解决方案1】:

$_SESSION 不会被调用 session_write_close() 破坏。所以$COPY=&$_SESSION; 并不是真正需要读取会话变量。

调用session_write_close() 后,对$_SESSION 的任何操作都将无法用于下一个请求。所以session_write_close()之后的session数据是没有办法破坏的。

session_write_close() 之后 PHP 不会启动新会话。

示例:如果您不断刷新页面

<pre><?php

session_start();
$_SESSION['t' . time()] = time();
session_write_close();

$_SESSION['p' . time()] = time();
var_export($_SESSION);

?></pre>

您会看到越来越多的t-timestamp,但只有最后一个p-timestamp。

【讨论】:

  • 太棒了!谢谢你的回答。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2011-03-27
  • 2013-10-11
  • 2013-01-02
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多