什么会导致PHP会话在第一次登录尝试时失败?

什么会导致PHP会话在第一次登录尝试时失败?,php,session,Php,Session,我的脚本创建了一个新的PHP会话,并立即将用户重定向到另一个页面 除了服务器闲置一小时左右后的第一次之外,这种方法每次都能正常工作。在第二次尝试之后,它又完美地工作了。在服务器空闲之后,它总是失败,在第一次尝试之后,它总是工作 编辑 当服务器空闲时,会话将不工作。从那以后一切都很好 从理论上讲,是什么原因导致会话在这样的第一次尝试中失败 我不想在这里发布任何代码,因为我不知道发布代码的哪一部分。这是使用PHP5.3在IIS7上实现的。使用CGI和FastCGI的结果相同 编辑 会话_start(

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

除了服务器闲置一小时左右后的第一次之外,这种方法每次都能正常工作。在第二次尝试之后,它又完美地工作了。在服务器空闲之后,它总是失败,在第一次尝试之后,它总是工作

编辑 当服务器空闲时,会话将不工作。从那以后一切都很好

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

我不想在这里发布任何代码,因为我不知道发布代码的哪一部分。这是使用PHP5.3在IIS7上实现的。使用CGI和FastCGI的结果相同

编辑
会话_start();在两个脚本上都调用。用户不会看到第一页,因为它会立即重定向到下一页。两个脚本之间的间隔不到一秒钟

PHP会话有一个超时(如果我正确理解了您的问题),这意味着它们将在超时后“重置”

您可以检查php.ini文件中的
session.gc\u maxlifest


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

PHP会话有一个超时(如果我正确理解了您的问题),这意味着它们将在超时后“重置”

您可以检查php.ini文件中的
session.gc\u maxlifest


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

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

会话存储在磁盘上。由于没有活动,服务器的磁盘可能正在旋转。然后,在磁盘旋转结束之前,脚本超时。可能吗

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

我把你的话解释为:第1页你正在运行
session\u start()
header('Location:'page2.php')
,但在第2页上,我觉得你似乎不再运行
session\u start()

您需要在将要使用的每个页面上设置会话\u start()。\u session。换句话说,将
session\u start()
放在所有PHP页面的顶部或计划在每个页面上运行的include文件中

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

我把你的话解释为:第1页你正在运行
session\u start()
header('Location:'page2.php')
,但在第2页上,我觉得你似乎不再运行
session\u start()


您需要在将要使用的每个页面上设置会话\u start()。\u session。换句话说,将
session\u start()
放在所有PHP页面的顶部或计划在每个页面上运行的include文件中。

回答我自己的问题。事实证明,这是由其中一个模块中的旧“功能”问题造成的。此“功能”设计用于在会话打开超过一小时后调用会话_destroy()来结束会话

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


将会话\u destroy更改为会话\u unset解决了问题。

回答我自己的问题。事实证明,这是由其中一个模块中的旧“功能”问题造成的。此“功能”设计用于在会话打开超过一小时后调用会话_destroy()来结束会话

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


将session\u destroy更改为session\u unset解决了这个问题。

我不得不说这是一个编码/逻辑错误,如果没有看到代码,就无法回答问题-但是可能会有很多猜测。当你说“服务器已闲置一个小时左右”时,这是否意味着您将网页加载到浏览器中,并让其在尝试登录之前放置一个小时左右?我使用@newfurniture:show some code,我的第一个猜测是您尝试访问
$\u会话
超级全局,但您的会话已过期。展示一些代码,并告诉我们您所说的是一个编码/逻辑错误,如果没有看到这些代码,就无法真正得到回答-但是可能会有很多猜测。当您说“服务器已闲置一个小时左右”时,这是否意味着您将网页加载到浏览器中,并让其在尝试登录之前放置一个小时左右?我使用@newfurniture:show some code,我的第一个猜测是您尝试访问
$\u会话
超级全局,但您的会话已过期。显示一些代码,并告诉我们您尝试了什么如果您不想编辑服务器上的ini文件,您也可以在
htaccess
文件中使用
php\u value session.gc\u maxlifest
。我认为,会话超时在应用于OP语句时没有意义。他说,用户第一次尝试登录时,它不工作,这表明会话是新的;当然,我也被他的“服务器空闲”语句弄糊涂了,所以谁知道呢。“除了服务器空闲一个小时左右后的第一次之外,这种方法每次都能很好地工作”——它只在服务器空闲后的第一次出现故障。这句话让我相信这可能是一个超时问题。@Prash