我正在查看 PHP 会话文件的内部表示,我注意到会话密钥由管道字符分隔|
.
在讨论我遇到的问题之前,让我先快速介绍一下会话文件的格式。至少,这是它在我的 Mac 上的格式化方式(10.9.4,PHP 5.4.24)。
会话文件格式
假设我有以下代码:
$_SESSION["age"] = 26;
$_SESSION["car"] = "Mazda";
$_SESSION["nerdy"] = true;
$_SESSION["likes"] = array(42, "being meta");
$_SESSION["stats"] = array("bmi" => 1000);
然后它被存储在会话变量中,如下所示:
age|i:26;car|s:5:"Mazda";nerdy|b:1;
likes|a:2:{i:1;i:42;i:2;s:10:"being meta"}
stats|a:1:{s:3:"bmi";i:1000}
一般格式为
session_key|session_value[;session_key|value] etc.
where session_value
是一般形式
type[:size]:value
更具体地说(如果有人感兴趣的话),
- 字符串:
s:3:"some text"
- 整数:
i:4
- 布尔值:
b:1
(正确)或b:0
(false)
- arrays:
a:2:{session_value;session_value;session_value;session_value}
哪里有四个session_value
大小为 2 的数组中的 s 是key;value
key;value
pairs.
问题
您可以看到,在上面,顶级会话密钥由|
特点。但是如果我们的会话密钥名称之一怎么办?includes the |
特点?
嗯,我尝试过。当我这样做时,整个会话文件(在/tmp
) was blank(并且变量肯定没有设置)。这是 PHP 开发人员的疏忽还是未记录的限制(或者是否在某处记录了)?
通过将 $_SESSION 键本身放在引号中或在 $_SESSION 键字符串中反斜杠任何管道,可以轻松解决此问题。这对我个人来说不是一个大问题,因为我无法理解为什么我需要放一个|
在 $_SESSION 变量键中 - 只是好奇它。
这是一个已知的错误
https://bugs.php.net/bug.php?id=33786 https://bugs.php.net/bug.php?id=33786
解决方法是更新到 5.5.4 并使用 php_serialize 会话序列化程序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)