【发布时间】:2015-08-20 23:11:44
【问题描述】:
我知道这个问题似乎和它被问过很多次一样,但请继续阅读。
问题是,正如标题所暗示的,当我向另一个页面发出 POST 请求时,会话数据没有保存在我的 PHP 脚本中。
- 是的,所有脚本的第一行都有
session_start();。 - 是的,我检查了 session_id 是否相同,确实如此。
- apache 日志没有显示任何错误(我有它显示所有 错误)
- 我测试了会话是否可以创建用于创建/读取会话变量的简单页面,并且可以正常工作。当我使用 POST 请求时,它的行为很奇怪。
两个脚本都在同一个服务器上。
我将展示我编辑的代码,只是为了展示它的作用。
脚本 A
<?
session_start();
echo session_id()."<br>";
print_r($_SESSION);
require_once __DIR__ . '/include/config.php';
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
session_set_cookie_params(
0,
ini_get('session.cookie_path'),
ini_get('session.cookie_domain'),
isset($_SERVER['HTTPS']),
true
);
$_SESSION['haygsdb18'] = true;
$_SESSION['user_name'] = '';
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
$_SESSION['REMOTE_ADDR'] = md5($_SERVER['REMOTE_ADDR']);
$include_path = str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
?>
$.post(
"<?=$include_path?>/include/ScriptB.php",
{OTP: OTP},
function(data) {
alert(data);
}
);
脚本 B
<?
session_start();
$msg = session_id()."\n";
$msg .= print_r($_SESSION,true);
exit($msg);
?>
这样我正在调试。脚本 B 显示相同的会话 id,但没有会话变量。
我想弄清楚它已经失去了理智。让我感到害怕的另一件事是服务器中另一个文件夹中的相同脚本(完全相同,复制粘贴)运行良好。
请帮忙...我的想法已经用完了。
更新:更多调试信息
我查看了由 php 在终端中使用 tail -f 创建的 sess 文件。加载脚本 A 时,变量被写入文件中,并且当进行 AJAX 调用时,文件被清空(不删除,只是清空)。
当脚本A执行$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);时,sess文件被写入HTTP_USER_AGENT|s:32:"2589a220583546006658f54ada687b45";,但是当脚本B执行$_SESSION['TEST'] = '1';时,sess文件中的所有内容被替换为C1Hw6hhbpX-jWhvbRfz_reKX4tT66bcNpYGLGzxEg7I.
大量调试.. 发现了一个奇怪的东西
我比较了 session_handler 如何在我使用相同登录脚本的其他系统中编写 sess 文件。在其他系统中,脚本 A 和脚本 B 将加密信息写入文件。问题是在这个特定系统中,脚本 A 没有使用任何加密写入文件,但脚本 B 是。
我怀疑脚本 B 期望会话信息被加密,所以因为它不是它无法读取变量并且它们已经消失了。当试图保持从脚本 B 到脚本 A 的变量时,也会发生同样的情况。
所以现在我的问题是,脚本 A 和脚本 B 怎么可能在我没有告诉他们这样做的情况下使用不同的 session_write 处理程序?我如何强迫他们使用相同的?
【问题讨论】:
-
我们需要脚本checkOTP.php的代码来检查..
-
这是脚本 B.. 我将编辑问题
-
尝试,而不是使用退出,这可能会导致您的会话过早关闭,只是为了回显您正在调试的任何内容。我在调试东西时被逼疯了太多次,代码中某处的
die()语句干扰了会话的持续。 -
它没有改变结果。