Tur*_*ile 24 php ajax session session-variables
Ahoy StackOverflow,
我在我的项目中遇到过这个问题:简而言之,从我收集的内容来看,通过AJAX调用的PHP脚本没有正确地注册在index.php页面顶部设置的SESSION变量.起初,我认为这是由于会话锁定,所以我继续并添加session_write_close(),但没有解决问题.
此问题仅在新用户会话开始后的大约25%的时间内发生(即:用户登录时).
我继续删除了90%的代码,以便将错误降低到重现所需的最小编码.
Firebug通过ajax.php导致的错误结果

Firebug通过ajax.php的预期结果

注:这两个结果表明指数的回报print_r($_SESSION)为Array ( [userid] => 3724 [trialstatus] => 1 [trialtcompletions] => 0 [userlevel] => 5 ),它可以让我知道这个问题是不是与会话中的索引页面上设置.
有没有人知道一个修复(可能甚至不是代码,甚至可能是服务器设置),它将正确地允许通过AJAX调用的脚本正确访问Session变量?
测试复制方案
的index.php
<?php
if (session_status() === PHP_SESSION_NONE) session_start();
if (!isset($_SESSION['userid']))
{
$_SESSION['userid'] = 3724; //$login['AccountID'];
}
$_SESSION['trialstatus'] = "12";
$_SESSION['trialtcompletions'] = "12";
$_SESSION['userlevel'] = "12";
session_write_close();
print_r($_SESSION);
?>
<!DOCTYPE html><html><head><script src="./js/jquery.min.js"></script>
<script>
function loadStage(step,input,callback){
$.ajax({
type: "POST",
url: "./ajax.php",
data: { step: step, input: input },
dataType: "JSON",
timeout: 5000,
success: function(data){
if(data !== false){
callback(data);
}
}
});
}
$(document).ready(function(){
startLoadingSequence();
});
function startLoadingSequence(skipped){
loadStage(1,skipped,function(data){});
}
</script>
</head></html>
Run Code Online (Sandbox Code Playgroud)
ajax.php
<?php
if (session_status() === PHP_SESSION_NONE) session_start();
print_r($_SESSION);
if (!isset($_SESSION['userid']))
{
die(json_encode(array(
"error",
"You must be logged in to view report data."
)));
}
?>
Run Code Online (Sandbox Code Playgroud)
每个请求:

阅读评论以获取更多信息
Jor*_*tín 11
有两件事可能导致这个问题.
如果您正在运行负载均衡器,那么您必须确保服务器正在达到数据的公共点.默认情况下,PHP将会话存储在本地文件系统中.如果负载均衡器将您从服务器A发送到服务器B(该文件不存在),那么这就成了问题.您可以设置网络共享并确保所有Web服务器都使用该共享.因此,您可以创建NFS共享,然后添加session_save_path或在php.ini中设置它
session_save_path('/your/nfs/share/here');
Run Code Online (Sandbox Code Playgroud)
另一种选择是编写自己的会话处理程序,将会话放入数据库.然后,您可以使用memcached之类的东西来存储会话,这样您每次阅读会话数据时都不会破坏数据库.
| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |