php - PHP 中的 session 变量消失

标签 php session theory

今天我在测试一些东西时遇到了一些奇怪的 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/

相关文章:

php - 将纳秒精度的 ISO8601 日期时间格式化为 d-m-Y H :i:s

PHP 如何调用 parent::__call() 并传入参数

language-agnostic - 解决 NP-Complete 问题的最佳运行时间?

php - 有没有更有效的编码方法?

在 Web 服务器上完成的数据库连接

php - 将查询另存为 CSV 文件,但无法获取要写入 CSV 的表头字段名称

php - 如何在 PHP 中获取有用的错误消息?

session - Gorilla session 包混淆

c# - Asp.net SessionID 的字符串格式是什么?

javascript - MVC 中 session 的客户端计时器