我的脚本会创建一个新的PHP会话,并立即将用户重定向到另一个页面。
除了服务器空闲一小时后第一次以外,每次都能正常工作。在第二次尝试之后,它再次完美地工作。在服务器空闲后,它总是失败,并且在第一次尝试之后它总是有效。
修改 当服务器空闲时,会话不起作用。之后一切正常。
理论上,在第一次这样的尝试中会导致会话失败的原因是什么?
我不想在这里发布任何代码,因为我只是因为我不知道要发布的代码的哪一部分。这是在IIS 7上使用PHP 5.3。使用CGI和FastCGI的结果相同。
修改 在session_start();在两个脚本上调用。用户不会看到第一页,因为它会立即重定向到下一页。脚本之间不到一秒钟。
答案 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解决了这个问题。