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

Posted

技术标签:

【中文标题】在 AJAX 请求上为空 $_SESSION 超全局,但保留会话 ID【英文标题】:Empty $_SESSION superglobal on AJAX request, but session ID is preserved 【发布时间】:2012-06-13 14:15:03 【问题描述】:

我在处理 AJAX 请求时遇到了 $_SESSION superglobal 问题。

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

我碰上了砖墙...我不知道为什么这不起作用...

在 Chrome 和 Firefox 中均已检查。

有什么想法吗?

更新:

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

代码:

index.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));

?>

index.php 输出:

SESSION_ID: xxxxxxxxxxxxxxxxxxxxxxx
SESSION_SIZE: 1

警报输出:

SESSION_ID: xxxxxxxxxxxxxxxxxxxxxxx (right session id)
SESSION_SIZE: 0

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

【问题讨论】:

你有session_start()之前的代码吗? 您的浏览器是否启用了cookies? 用 var_dump() 检查它 你可能遗漏了一些重要的代码。 Cookies 已启用,否则不会设置 session_id :) session_start() 之前没有代码并且会话建立成功,否则 session_id() 函数将返回空字符串。来自主脚本和 AJAX 调用脚本的会话 ID 是相同的。 (用回声测试它,如我原来的问题中所写) 【参考方案1】:

这可能是因为如果你没有在 $_SESSION 中输入任何值。它会告诉你 array() 在做print_r($_SESSION) 尝试设置一个值$_SESSION['user']='frankie' 然后做print_r($_SESSION); session_id() 从未显示在 $_SESSION 数组中。

【讨论】:

我不是新手 Chaitanya :) 当然我已经用字符串测试过了 :) $_SESSION["test"]="test";是我的测试会话变量。【参考方案2】:

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

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

而不是这个:

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

刷新页面时,您的 SESSION_SIZE 计数应该会增加。如果不增加,可能是php.ini中的session存储参数不对?例如,将会话写入文件时出现问题,或者如果您将其用于会话,则会出现 memcache 问题。

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

【讨论】:

我现在创建了完全独立的代码来测试 PHP 设置,并且使用此代码一切正常......所以,错误一定是我的代码。问题是我的代码复杂、冗长且难以调试。感谢大家的意见。找到后我会发布解决方案。【参考方案3】:

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

结果是每次调用 session_start() 都会重置 $_SESSION 超全局变量并将其清空,但留下相同的会话 ID,这让我感到困惑并朝错误的方向抛出。直到我把所有东西都剥离到骨子里,很明显我的代码中没有错误。

感谢所有感兴趣的人。

【讨论】:

以上是关于在 AJAX 请求上为空 $_SESSION 超全局,但保留会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

ajax编写购物车遇到的问题

如何将 $_SESSION 变量添加到 Ajax 请求中并将数据插入到 mysql 数据库 PHP 中?

11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用

ajax请求后php会话值被擦除

路由请求时 HttpContext.Current.Session 为空

为啥提交ajax请求时请求随机为空?