什么可能导致PHP会话在首次登录尝试时失败?

时间:2012-11-06 14:22:02

标签: php session

我的脚本会创建一个新的PHP会话,并立即将用户重定向到另一个页面。

除了服务器空闲一小时后第一次以外,每次都能正常工作。在第二次尝试之后,它再次完美地工作。在服务器空闲后,它总是失败,并且在第一次尝试之后它总是有效。

修改 当服务器空闲时,会话不起作用。之后一切正常。

理论上,在第一次这样的尝试中会导致会话失败的原因是什么?

我不想在这里发布任何代码,因为我只是因为我不知道要发布的代码的哪一部分。这是在IIS 7上使用PHP 5.3。使用CGI和FastCGI的结果相同。

修改 在session_start();在两个脚本上调用。用户不会看到第一页,因为它会立即重定向到下一页。脚本之间不到一秒钟。

4 个答案:

答案 0 :(得分:2)

会话存储在磁盘上。由于没有活动,您的服务器磁盘可能正在停止运转。然后在磁盘完成旋转之前,您的脚本会超时。可能的?

答案 1 :(得分:1)

PHP会话超时(如果我理解你的问题),这意味着他们将在超时后“重置”。

您可以查看php.ini文件中的session.gc_maxlifetime:)

如果我没有正确理解,那么代码本身可能会出错。

答案 2 :(得分:0)

  

我的脚本会创建一个新的PHP会话,并立即将用户重定向到另一个页面。

我将您的文字解释为:Page 1您正在运行session_start()header('Location: 'page2.php'),但在第2页上,我似乎再次没有session_start()

您需要在将使用$_SESSION的每个页面上使用session_start()。换句话说,将session_start()放在所有PHP页面的顶部或您计划在每个页面上运行的包含文件中。

答案 3 :(得分:0)

回答我自己的问题。事实证明它是由一个包含的模块中的旧“特征”引起的。这个“功能”旨在通过调用session_destroy()来结束会话,如果会话已经打开超过一个小时。

这导致了一个问题,当用户尝试登录时,PHP会注意到一个旧会话并调用session_destroy()。在此之后,一切似乎都很好,但没有新的会话变量可以写入会话。 PHP日志中没有任何问题。

将session_destroy更改为session_unset解决了这个问题。