gpt4 book ai didi

PHP Session 的数据在页面重新加载之间不一致 - 尽管 Session ID 相同

转载 作者:行者123 更新时间:2023-12-05 07:48:47 24 4
gpt4 key购买 nike

我的一些 PHP 代码遇到了一个非常奇怪的问题。我打开了错误报告,但也没有任何反应。

基本上我有一个将数据推送到 $_SESSION[] 的表单。代码是:

<?php 
session_start();
$_SESSION['contact']['name'] = $_GET['name'];
$_SESSION['contact']['email'] = $_GET['email'];
$_SESSION['contact']['question'] = $_GET['question'];

session_write_close();
header('Location: confirm.php');
exit;
?>

有效。然而,confirm.php 将完全随机 接收或不接收此数据。如果我刷新多次,我有时会获得数据,有时则不会。

这是确认码:

<?php
ini_set('display_errors', 'on');
error_reporting(-1);

session_start();

print "SeshID:" . session_id() . "<br>";
print "CookieID:" . $_COOKIE['PHPSESSID'] . "<br>";
print "Status" . session_status() . "<br>";
print "Loc" . session_save_path() . "<br>";
print "Cookie";
print_r(session_get_cookie_params());
print "<br>Data:<br>";

print_r($_SESSION);
?>

同样,没有错误。没有任何看起来明显错误的东西出现。

奇怪的是,有时当我刷新确认页面时,我会得到一个空的“Array ( )”。有时我会无缘无故地收到“Array ( [contact] => Array ( [question] => test [name] => [email] => test@test.com) )”......

我在执行此操作之间没有运行其他脚本 - 只有上面检查 session 内容(确认)的脚本需要重新运行,并且只有数据以某种方式发生变化。我运行了几次表格,然后是这个检查脚本,它完全不一致。 session ID 和 cookie ID 永远不会改变,并且始终相同

是否缺少某些 PHP 设置?我真的很奇怪,这些似乎正在拉出已被覆盖的数据。

最佳答案

已解决!

我会为有同样问题的人发布我自己的答案。感谢在评论中帮助我发现这一点的人!

问题

问题是服务器正在使用我的 Azure 集群或分布式网络来提供 PHP 文件。

The first call writes the session data to machine 1, and the confirm is then reading from machine 2, which doesn't have the right info. In clusters, /tmp is often not mirrored, and that is where the session data is stored. Talk to your cluster admin about this. – Bart Friederichs

似乎正在发送表单并将 session 变量存储在服务器 1 上,但拉取 session 数据的页面是服务器 2、服务器 3,有时是服务器 1 - 因此出现奇怪的行为查看先前提交的内容并偶尔更正数据。

修复

这里有两个可能的修复方法。一:

session 存储目录并未在所有服务器上进行镜像

在这种情况下,通过更改 php.ini 中的“session.save_path”或使用

来更改 session 目录
session_save_path(dirname(__FILE__). '/sessions/');

在受影响的文件的顶部在您调用 session_start() 之前(这是我们网站中唯一使用 session 的部分,因此这是一个好的/肮脏的修复)。

这里的重点是将其更改为一个目录,该目录肯定会在集群中的每台服务器上进行镜像。

session 正在以另一种未镜像的方式保存

在我的实际案例中,我发现我的 session 处理程序是问题所在。通过使用

phpinfo();

我发现我的 session.save_handler 是“wincache”,这是一个加速 PHP 的插件。这样做的一种方法似乎是使用共享内存或其他东西来加速 session 数据的加载。

无论哪种方式,这都不适合我的设置,我通过简单地更改变量以使用默认值来修复它:"file"。

同样,最好的方法是使用您的 php.ini 并将 session.save_handler 设置为"file",但我无权访问该文件,因此,我再次before session_start() 只是在两个文件的 header 中使用了一个调用。

ini_set("session.save_handler", "files");

我不会推荐这个,因为你知道当一个新的开发人员进来时它会出现并在背后咬你一口而你忘记了 - 最好更改你的 .ini

无论如何,就是这样。

感谢大家的帮助!

一边

许多服务器解决方案(例如 Azure)实际上提供了自己的插件和 session 处理程序,专门用于应对这种情况。如果可能,您当然应该使用它们!

关于PHP Session 的数据在页面重新加载之间不一致 - 尽管 Session ID 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38196924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com