有时会加载旧的 PHP 会话变量

Old PHP session variable is loaded sometimes

本文关键字:PHP 会话 变量 加载      更新时间:2023-09-26

我有一个页面,其中包含一些用户可选择的选项和一个按钮,单击该按钮时,将运行PHP脚本,然后使用另一个PHP文件刷新div,该文件使用在第一个PHP脚本结束时创建的会话变量。如果用户再次按下按钮,并选择了不同的选项,则使用新替换的会话变量更新div。问题是有时(可能是十分之一左右)加载旧的会话变量数据。我怀疑第二个 PHP 文件在更新之前过早地捕获了该变量,但我尝试在不同点取消设置会话变量,但没有任何运气。

第一个 PHP 文件:

session_start();
$needle = array();
foreach($_POST['checkboxes'] as $key => $value){
$needle[] = "$value";
}
// code that processes the values from needle and outputs $data
unset($_SESSION['data']);
$_SESSION['data']=$data;

第二个 PHP 文件:

session_start();
echo $_SESSION['data'];

Javascript:

$(".userdata").click(function() {
   $.post("first.php", $("form#checkboxes").serialize());
});
$(function() {
   $("#button").click(function() {
   $("#div").load('second.php')
   })
})

问题是在某些情况下,在您单击加载第二个 PHP 脚本的按钮之前,第一个 PHP 脚本还没有完成运行(就像我之前在我的评论中暗示的那样)。发生这种情况的事实与Web服务器如何安排脚本有关(这完全是一个不同的主题)。

因此,您需要确保在单击运行第二个脚本的按钮时,第一个脚本已完全完成运行。

因为据我所知,javascript 不允许对变量进行阻塞/信号(就像 Java 那样),你必须使用一种更"肮脏"的技术,称为繁忙等待。

最好的方法是在你正在使用的javascript中包含一个额外的变量。

var wait = false;
function reloadSecond (){
  if (wait){
    setTimeout('reloadSecond()',200);
  } else {
    $("#div").load('second.php');
  }  
}
$(".userdata").click(function() {
   wait = true;
   $.post("first.php", $("form#checkboxes").serialize(), function(){
     wait = false;
   });
});
$(function() {
   $("#button").click(reloadSecond);
})

虽然"忙于等待"通常不被认为是最优雅的解决方案,但我认为在这种情况下您没有太多其他选择(除了服务器端推送,它要复杂得多)。此外,您可能只会产生额外的 200 毫秒(或更短,您当然可以更改此值)等待时间一两次。

(旁注:我假设javascript在这里是单线程的,这在几乎所有情况下都是正确的:JavaScript保证是单线程的吗?

可能是浏览器或代理服务器缓存 html 数据的情况吗?尝试设置标头以告诉它们不要缓存。请参阅 http://php.net/manual/en/function.header.php 中的示例,了解要设置的标头。