空 $_SESSION AJAX 请求上的超全局,但会话 ID 保留


Empty $_SESSION superglobal on AJAX request, but session ID is preserved

我在 AJAX 请求$_SESSION超全局时遇到问题。

session_start()函数在任何会话编码之前调用。会话 ID 在调用代码和 AJAX 响应代码中也是相同的(通过两个脚本中的回显session_id()进行测试)。AJAX PHP 文件位于同一域中。一切都应该按照标准的定义工作,但是当我在调用的 AJAX 脚本文件中执行print_r($_SESSION)时,我得到Arrray( )输出。

我撞到了砖墙...我不知道为什么这不起作用...

在Chrome和Firefox中都已检查。

有什么想法吗?

更新:

问题出在$.ajax(...)请求上!当我执行 AJAX 请求时,它知道正确的会话 ID,并且 session_start() 函数返回TRUE(成功继续会话),但随后它会重置我的超全局$_SESSSION!它清空了它...我还不知道为什么...

法典:

索引.php:

<?php
session_start();
$_SESSION['Test']='O.K.';
echo("SESSION_ID: " . session_id());
echo("SESSION_SIZE:" . sizeof($_SESSION));
?>
... Standard HTML stuff and jQuery include ...
<script>
    $.ajax(
    {
        type: "POST",
        url: "AJAXTest.php",
        data: null,
        success: function(sData) { alert(sData); }
    });
</script>

AJAXTest.php:

<?php
session_start();
echo("SESSION_ID: " . session_id());
echo("SESSION_SIZE:" . sizeof($_SESSION));
?>

索引.php输出:

SESSION_ID: xxxxxxxxxxxxxxxxxxxxxxx
SESSION_SIZE: 1

警报输出:

SESSION_ID: xxxxxxxxxxxxxxxxxxxxxxx (right session id)
SESSION_SIZE: 0

而在 AJAX 调用之后,$_SESSION 是空的。在具有相同会话的所有其他脚本中...我很困惑...

可能是

因为如果你没有在$_SESSION中输入任何值。 它会向你显示 array() 在做print_r($_SESSION)
尝试设置值$_SESSION['user']='frankie'
然后做print_r($_SESSION);
session_id() 永远不会显示在 $_SESSION 数组中。

这可能不是 AJAX 的问题,而是会话本身的问题。现在,您只是在测试 $_SESSION 数组和会话 ID,而不是会话存储本身。尝试查看会话状态在多个非 AJAX 请求中是否保持不变。例如,使用以下命令:

$_SESSION['Test' . time()]='O.K.';

取而代之的是:

$_SESSION['Test']='O.K.';

刷新页面时,SESSION_SIZE计数应增加。如果不增加,也许 php.ini 中的会话存储参数不正确?例如,将会话写入文件时出现问题,或者 memcache 出现问题(如果将其用于会话)。

还要确保在页面和 ajax 调用之间没有发出其他请求 - 也许一些调用的脚本会重置你的 $_SESSION 数组?

问题出在我的自定义 php.ini 文件中...它显然搞砸了一些会话重要设置(即使它们没有定义 ->更改)。

结果是每次调用 session_start() 都会重置 $_SESSION 超全局并清空它,但留下相同的会话 ID,这让我感到困惑并朝着错误的方向投掷。在我剥离到骨头之前,很明显错误不在我的代码中。

感谢所有感兴趣的人。