PHP会话变量没有保存(虽然有些是)

时间:2011-01-25 21:05:48

标签: php iis session

我一直无法弄清楚这个问题 - 它没有任何意义。

服务器是在Windows NT PDP-IIS 5.2 build 3790上运行的PHP 5.2.6。

首先,我确认会话正在通过此测试脚本工作:

<?php 
session_start(); 
if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
echo "Counter ".$_SESSION['counter']++.".<br><a href=".$_SERVER['PHP_SELF'].">reload</a>"; 
?>

计数器递增 - 它可以工作。

我的网站正在使用自定义构建的MVC框架(我编写了它),并且我将应用程序函数的最后一个代码放到此用于测试目的:

echo session_id(); echo '<pre>'; var_dump($_SESSION); echo '</pre>';
session_write_close(); exit();

此文件的前几行是:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
session_start();

会话转储并按预期显示。现在我转到服务器并打开会话文件 - 结果似乎取决于我正在使用的浏览器。对于Chrome和Safari,会话文件为空。对于Opera和IE8,会话文件看起来很好。我会在一分钟内到达FireFox - 但此时FireFox显得很好。

因此,为了在session_start()之后立即进行测试,我添加了以下行:

$_SESSION['bogus'] = -5;
$_SESSION['test'] = 'other';

我关闭了我的浏览器并再次尝试了该网站,因此我可以确定我有一个新的会话。再次Opera和IE8会话文件似乎很好。 Chrome和Safari都有“虚假”和“测试”值,但我的其他SESSION值却丢失了。 FireFox起初与Chrome和Safari有同样的问题 - 但在刷新页面时,会话的其余部分出现了。刷新对Chrome或Safari没有帮助。

这就是var_dump在这一点上的样子:

array(3) {
  ["bogus"]=>
  int(-5)
  ["test"]=>
  string(5) "other"
  ["saved_form"]=>
  array(1) {
    ["dgvSJM"]=>
    array(4) {
      ["method"]=>
      string(4) "post"
      ["processor"]=>
      string(0) ""
      ["formid"]=>
      string(10) "searchForm"
      ["fields"]=>
      array(2) {
        ["searchTerm"]=>
        array(5) {
          ["label"]=>
          string(10) "SearchTerm"
          ["type"]=>
          string(6) "search"
          ["required"]=>
          bool(false)
          ["multiple"]=>
          bool(false)
          ["selectempty"]=>
          string(6) "B5BMXw"
        }
        ["formInput_0"]=>
        array(5) {
          ["label"]=>
          string(0) ""
          ["type"]=>
          string(6) "submit"
          ["required"]=>
          bool(false)
          ["multiple"]=>
          bool(false)
          ["selectempty"]=>
          string(6) "TkZUfo"
        }
      }
    }
  }
}

我使用不同的子域创建了一个不同的网站,并完全复制了我的代码 - 它工作正常'saved_form'在会话文件中完美显示。所以我尝试删除原始网站并重新创建它 - 没有帮助解决问题。

任何人都知道发生了什么和/或我如何解决它?

感谢。

1 个答案:

答案 0 :(得分:0)

我相信我已经解决了这个问题。

在我的应用程序处理'saved_form'键后 - 它在每次运行时执行 - 它出于安全原因将其删除。

我正在使用重写模块进行更好的链接(模块是IIRF)。

这就是问题所在 - 虽然这不是模块的错,只是我的规则。

在页面呈现并保存会话后 - 浏览器向favicon.ico发出了另一个请求,但我设置的规则导致该请求通过我的应用程序运行并且表单已处理并从会话中删除 - 从而导致我看到的奇怪的行为。我添加了一条规则来忽略它,它再次起作用。