我知道这个问题看起来好像被问了很多次,但请继续阅读。
问题是,与标题建议一样,当我向另一个页面发出POST请求时,会话数据没有保存在我的PHP脚本中。
session_start();
。两个脚本都在同一台服务器上。
我将编辑我的代码,以显示它的作用。
脚本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,但没有会话变量。
我试图弄明白我的想法。另一件让我感到震惊的事情是,服务器中另一个文件夹中的相同脚本(完全相同,复制粘贴)运行良好。
请帮助......我没有想法。
更新:更多调试信息
我在终端中使用sess
查看了php创建的tail -f
文件。加载脚本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处理程序?我如何强迫他们使用相同的东西?
答案 0 :(得分:11)
我终于明白了。
正如我在问题中发布的那样,问题是session_handler正在使用不同的编码编写sess文件。因此,两个尝试读取文件的脚本都没有正确读取变量。
我有一个php.ini
文件,用于使用指令
default_charset = "iso-8859-1"
我不得不使用此指令,因为服务器管理员做了一些更改。我在根目录中创建了一个.user.ini
文件以使用ISO编码,但我忘记删除此php.ini
文件。
由于php.ini
文件仅影响其中一个脚本(另一个文件位于不同的文件夹中),因此charset可能会破坏编码/解码过程。所以我删除了该指令,问题就消失了。
希望这个问题能帮助将来的某个人。
答案 1 :(得分:0)
您的会话未写入磁盘或您正在使用的任何存储,因为在您进行ajax调用时可能无法完成脚本执行。
您可以使用session_write_close()函数将会话数据保存到存储(很可能是您的/ tmp /文件夹) http://php.net/manual/tr/function.session-write-close.php
<?php
session_start();
echo session_id()."<br>";
print_r($_SESSION);
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']);
//write the session before the script execution ends
session_write_close();
$include_path = str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$.post("scriptB.php", {OTP: "OTP"}, function(data) {
alert(data);});
});
</script>
</head>
<body>
</body>
</html>
这是我的输出;
tdiiqame0i4ldshc8m20n8d9o6
Array
(
[haygsdb18] => 1
[user_name] =>
[HTTP_USER_AGENT] => bc9d9d38aa0626db612842a1e0d09ea9
[REMOTE_ADDR] => f528764d624db129b32c21fbca0cb8d6
)
答案 2 :(得分:0)
尝试设置会话时间:
define("SESSION_TIME_EXPIRED",'172800');
session_set_cookie_params(SESSION_TIME_EXPIRED);
session_name('user');
session_start();
答案 3 :(得分:0)
不session_set_cookie_params(0, ...)
创建立即过期的会话?
http://php.net/manual/en/function.session-set-cookie-params.php
答案 4 :(得分:0)
I had a same problem. I was using custom sessions. use this
session_regenerate_id();
NOT
session_regenerate_id(true);
use this just after starting session