我知道这个问题似乎经常被问到,但请继续阅读。问题是,正如标题所示,当我向另一个页面发出POST请求时,我的PHP脚本中的会话数据未保存。
这是我的调试方式。脚本B显示了相同的会话ID,但没有会话变量。
我已经疯狂地想办法解决这个问题了。另一件让我感到困扰的事情是,服务器上的另一个文件夹中完全相同的脚本可以正常工作。
请帮帮我... 我已经没有更多的想法了。
更新:更多调试信息
我通过终端中的“tail -f”查看了PHP创建的'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.'。
大量调试..发现了奇怪的事情
我比较了其他系统中使用相同登录脚本的会话处理程序是如何编写'sess'文件的。在其他系统中,“Script A”和“Script B”都会将加密信息写入文件。问题在于,在这个特定的系统中,“Script A”没有以任何方式编写文件,但是“Script B”是这样的。
我怀疑“Script B”期望会话信息已经加密,因此因为它没有能够读取变量,它们就消失了。当尝试从“Script B”保持变量活动到“Script A”时,情况也是一样的。
所以现在我的问题是,即使我没有告诉它们如何做到这一点,为什么“Script A”和“Script B”正在使用不同的session_write处理程序?我如何强制它们使用相同的处理程序?
- 是的,所有脚本都在第一行使用了
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);
}
);
Script B
<?
session_start();
$msg = session_id()."\n";
$msg .= print_r($_SESSION,true);
exit($msg);
?>
这是我的调试方式。脚本B显示了相同的会话ID,但没有会话变量。
我已经疯狂地想办法解决这个问题了。另一件让我感到困扰的事情是,服务器上的另一个文件夹中完全相同的脚本可以正常工作。
请帮帮我... 我已经没有更多的想法了。
更新:更多调试信息
我通过终端中的“tail -f”查看了PHP创建的'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.'。
大量调试..发现了奇怪的事情
我比较了其他系统中使用相同登录脚本的会话处理程序是如何编写'sess'文件的。在其他系统中,“Script A”和“Script B”都会将加密信息写入文件。问题在于,在这个特定的系统中,“Script A”没有以任何方式编写文件,但是“Script B”是这样的。
我怀疑“Script B”期望会话信息已经加密,因此因为它没有能够读取变量,它们就消失了。当尝试从“Script B”保持变量活动到“Script A”时,情况也是一样的。
所以现在我的问题是,即使我没有告诉它们如何做到这一点,为什么“Script A”和“Script B”正在使用不同的session_write处理程序?我如何强制它们使用相同的处理程序?
die()
语句干扰了会话的持久化而疯狂地调试过很多次。 - rdiz