今天我在测试一些东西时遇到了一些奇怪的 session 行为。首先,我的任务是为 WordPress 网站创建注册功能。我过去在 WordPress 中完成了大量工作,但从未做过任何涉及任何服务器端脚本语言的工作。
我正在测试我的工作环境,其中包括确保我能够连接到 MySQL、确保 session 正常工作,以及基本上只是熟悉设置。
在测试 session 时,我执行了以下操作:
<?php
$timer = time();
$_SESSION[$timer] = $timer;
print_r($_SESSION);
?>
我期望在页面第一次加载时看到这样的内容:
Array
(
[1396745563] => 1396745563
)
...这正是发生的事情。在第二次刷新时,我想看到:
Array
(
[1396745563] => 1396745563
[1396745570] => 1396745570
)
...但相反,我看到:
Array
(
[1396745570] => 1396745570
)
哇!时间戳 1396745563 的原始 session 变量已消失,取而代之的是一个新变量。
我的第一 react 是可能缺少 session_start()
,但事实并非如此。为了进一步说服自己这有些奇怪,我将代码更改为如下所示:
<?php
$timer = time();
$_SESSION['time_' . $timer] = $timer;
print_r($_SESSION);
?>
我认为也许拥有一个带有索引时间戳的 session 变量有某种特殊的行为(据我所知,这可能是这个问题的答案)。
这一次,行为完全符合我的预期。每次刷新页面都会添加到数组打印输出中。页面刷新几次后,看起来像这样:
Array
(
[time_1396745663] => 1396745663
[time_1396745667] => 1396745667
[time_1396745671] => 1396745671
[time_1396745675] => 1396745675
[1396745570] => 1396745570
)
那个奇怪的变量是从我最初的尝试中继承下来的 session 数据(我只是为了精确)。
有人能解释一下这种极其奇怪的行为吗?我想不出任何明显的我可以做的事情会导致这种情况。
注意:我怀疑这与 WordPress 有任何关系;我添加它只是为了给出这样做背后的动机。
最佳答案
$_SESSION
的键遵循与 PHP 中有效变量名称相同的规则。它们必须以字母或下划线开头,后跟任意数量的字母、数字或下划线。因此,time()
的输出不能作为键,除非它至少有一个字母或下划线作为前缀。
将行 error_reporting(E_ALL);
添加到您的代码中,PHP 将抛出如下通知:
Notice: Unknown: Skipping numeric key 1396747512 in Unknown on line 0
关于php - PHP 中的 session 变量消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22888858/