【问题标题】:PHP's real SESSION objectPHP 真正的 SESSION 对象
【发布时间】:2011-01-23 13:21:33
【问题描述】:

编辑:(已更新)

也许我的问题不够清楚。好吧,让我们这样说:

$arr["a"] = 10; 
var_dump($arr);
$arr["b"] =& $arr["a"];
var_dump($arr);

第一个 var_dump 返回:

array
  'a' => int 10

当第二个返回时:

array
  'a' => &int 10
  'b' => &int 10

如果我 unset($arr["a"]) 它将返回:

array
  'b' => int 10

规则是,当 2 个或更多变量“指向”相同的内容时,var_dump 将使用 & 字符 (&) 显示引用。

在 $_SESSION 的情况下,即使 register_long_arrays = Off $_SESSION 仍然显示引用。所以很明显其他变量也指向相同的内容。

换句话说,如果我 unset($_SESSION) 仍然有其他变量可以链接到某个地方。在上面的示例中,当我 unset($arr["a"]) 创建链接时,我仍然可以恢复该内容,例如: $arr["z"] = & $arr["b"].

所以,我最初的问题是,有谁知道另一个变量是哪个?这样的变量很可能不存在......但我想知道为什么 PHP 内部会显示该引用。

谢谢


(原问题:)

在 PHP 中创建会话时,例如:

session_start();
$_SESSION["name"] = "my name";

并转储 GLOBAL 变量:

var_dump($GLOBALS);

你会看到类似的东西:

  'HTTP_SESSION_VARS' => &
    array
      'name' => string 'my name' (length=7)
  '_SESSION' => &
    array
      'name' => string 'my name' (length=7)
  'HTTP_SERVER_VARS' => 
    array
      ...

如您所见,变量 $GLOBAL[HTTP_SESSION_VARS] 和 $_SESSION 都是 对其他对象内容的引用...有人知道那个对象是哪个吗?

理论上,如果我取消设置这两个变量,一定可以通过某种方式访问​​它 内容...有什么线索吗?

谢谢!

【问题讨论】:

  • 我一直在查看 Zend 的 PHP 源代码,有趣的是在 main/php_variables.c 中所有超全局变量都已初始化,但 SESSION 在 ext/session/session.c 中有自己的文件。到目前为止,我不知道它是否可能。

标签: php reference httpsession superglobals var-dump


【解决方案1】:

HTTP_SESSION_VARS 不是为了向后兼容吗?

【讨论】:

    【解决方案2】:

    $HTTP_SESSION_VARS$_SESSION 的旧名称,已弃用——您不应再使用它了。

    那些$HTTP_*_VARS 变量不一定要设置:它们只有在启用了register_long_arrays 配置指令时才会设置——并且对于最新版本的PHP(即PHP 5.3),它具有已弃用。


    例如,在我运行 PHP 5.3.2 的服务器上,您提供的代码部分:

    session_start();
    $_SESSION["name"] = "my name";
    var_dump($GLOBALS);
    

    仅输出(经过几次刷新,这说明了PHPSESSID cookie 的存在)

    array
      'GLOBALS' => 
        &array
      '_POST' => 
        array
          empty
      '_GET' => 
        array
          empty
      '_COOKIE' => 
        array
          'PHPSESSID' => string 'fnlujfapqg7kdk1ocve6ndb282' (length=26)
      '_FILES' => 
        array
          empty
      '_SESSION' => &
        array
          'name' => string 'my name' (length=7)
    

    没有任何$HTTP_*_VARS 变量的踪迹:register_long_arrays 配置指令被禁用。

    【讨论】:

      【解决方案3】:

      嗯,在 PHP 5 中,$HTTP_SESSION_VARS 仅出于兼容性原因而保留。强烈建议您改用$_SESSION。来自 PHP 手册:

      $HTTP_SESSION_VARS 包含相同的初始信息,但不是超全局的。 (注意 > $HTTP_SESSION_VARS 和 $_SESSION 是不同的变量,PHP 处理 他们就是这样)

      编辑
      你说你“已经知道了”!?那你的问题是什么? $_SESSION 不是对象,毕竟它是一个数组,一个超全局变量。没有方法,没有成员。您可以像访问任何其他数组一样访问它的值:$_SESSION['key']

      您可以编写自己的 Session 类来包装 PHP 的会话管理。使用session_set_save_handler 方法绕过内置的会话管理并实现您自己的逻辑。

      问候。

      【讨论】:

        【解决方案4】:

        它是存储在会话文件中的数据数组,会话文件是存储在服务器上的实际临时文件。就像他们俩都指出的那样,它是一个数组,没有“会话”对象。这些值在您运行 session_start 时填充,这基本上会根据该用户的 PHPSESSID cookie 从文件中加载数据。

        【讨论】:

        • 好的,谢谢。那么这个数组在哪里呢?为什么 var_dump 显示引用而不是“普通”数组作为其余超全局变量?
        • -1|废话。它不是服务器上的“文件”。它在运行时保存在内存中,只有在执行后才写入“文件”(如果使用基于文件的会话处理,那就是)。
        • @aefxx:所有服务器都使用基于文件的会话。你可以自己去 /tmp 目录查看所有的会话文件。 PHPSESSID 只是对在路径 /tmp/sess_PHPSESSID 处为该唯一标识符存储会话数据的文件的引用。我可以进去打开所有会话文件并查看其中的数据,它们都在文件中以x|x:x:x; 的形式出现。数据必须存储在某处,以便session_start... 再次获取
        • 听说过 session_set_save_handler 方法吗?它允许您实现自己的会话逻辑。实际上,基于文件的会话存储是默认设置,但任何不了解的人都会使用诸如 memcached 服务器之类的东西来存储其用户的数据。
        • 无论你怎么做,你仍然将数据存储在某个文件中,当你调用session_start时,你要么从内存缓存中读取内容,要么从内存缓存中获取内容
        猜你喜欢
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多