2013-03-14 96 views
1

session变量$_SESSION['']的范围是什么?如果我有一堆网页调查串在一起,一个接一个,session variable会在一段时间后过期,或者只要您不关闭浏览器就会存在?如果你休眠你的电脑会发生什么?php start_session()的范围是什么?

冬眠后,我似乎已经失去了一个会话变量,我不确定这是否是问题或者是否存在其他问题。

+0

据我所知,如果你有所有的网页会话开始,没有会话破坏,除非你关闭浏览器,否则不应该结束会话 – 2013-03-14 19:19:04

+1

你可能会发现[这个问题](http://stackoverflow.com/questions/1516266 /多久会我会议 - 最后)有用吗? – ajp15243 2013-03-14 19:21:04

+0

是否需要在每个页面上或每个想要实际使用会话变量的页面上启动会话?我没有在每一页上,但它似乎继续传递(直到我的休眠问题等)。 – user1015214 2013-03-14 19:22:15

回答

2

会话作为一个整体(而不仅仅是单个变量)可以继续或丢失,原因很多。

在默认配置中,当浏览器关闭时,会话意味着“丢失”,因为浏览器将删除识别会话的cookie。它仍然在服务器上的某个地方,直到会话垃圾收集删除它。因此,浏览器长时间处于空闲状态可能仍会丢失会话,因为PHP会删除最近未使用的浏览器。

检查the configuration。特别是,如果您需要保持较长时间的会话,则可能需要根据需要调整“session.gc_maxlifetime”和“session.cookie_lifetime”。

1

会话变量不会过期。 会话session_gc.maxlifetime and other configuration options为限。

会话不受限于浏览器。但是,浏览器可能会选择不将所需的信息发送到服务器,以便服务器恢复先前的会话。这通常发生在浏览器将所有Cookie当作会话cookie时发生。

在此上下文中,术语会话cookie并不意味着保存会话标识符或会话变量的cookie。相反,只要浏览器关闭(即浏览器前面的用户会话结束),Cookie就会消失。

+0

我在哪里以及如何设置session_gc.maxlifetime?我正在某人的服务器上运行一个程序,并且无法访问php.ini文件。 – user1015214 2013-03-14 19:41:29

+0

使用['ini_set()'](http://www.php.net/manual/en/function.ini-set.php)。 – Oswald 2013-03-14 20:25:27

1

上取决于:

  • 的cookie的有效期,0应该意味着“直到浏览器关闭”,但Firefox/Mozilla浏览器倾向于把它(因为他们的“恢复会话”功能)作为'永远'(这是恕我直言一个安全问题,所以你应该收到一个空的会议阵列重新生成你的ID)。所以:依赖于用户代理。
  • 过期会话的配置垃圾回收。请注意,您可以让网络服务器处理这个问题(清理旧数据的百分比变化),这使得它有点不可预知。然而,一些软件包(例如Debian上的PHP)只是使用cronjob来删除过时的会话,如果您的自定义session.gc_maxlifetime设置由于另一个服务器范围的设置而被忽略,那么可能会造成严重破坏。

换句话说,如果您的UA决定保留cookie,并且没有流程决定删除数据,那么您的会话仍然存在。这要求您了解UA和服务器的设置。