2012-07-31 68 views
3

确定有很多“简单会话”的问题,但我似乎无法找到我所追求的。由于PHP文档似乎没有解释得那么好,所以它让我感到有些不适。PHP的session_destroy和会话范围?

三折的问题。

  1. 它说,session_destroy()会清除会话数据而不是全局变量。所以它抹去了数据,但变量仍然保持机智?文档对全局变量意味着什么?

  2. 有哪些不同类型的,我可以用它来破坏会话数据的方式,是不是session_destroy就够了吗?为什么要使用下面的编码,因为我已经看到了一些代码示例:

    session_start(); 
    $_SESSION = array(); 
    session_destroy(); 
    
  3. 会议似乎整个浏览器实例坚持。例如,当两个独立的浏览器打开时,IE9将保持相同的会话ID。与Chrome相同。只有当我关闭所有的浏览器时,我是否会得到一个新的会话ID。这对所有浏览器来说都是如此吗?我想知道,这样我可以在我的编码过程中记住这一点 - 不想后来发现,一些浏览器是不是永久的,我的代码,认为它,然后运行时产生各种错误的风险。

在此先感谢任何人可以帮助我回答这些问题。

回答

1
  1. $_SESSION是超级全局变量
  2. session_destroy功能basicly足够了。它删除存储所有会话变量的服务器上的session_file,并删除会话cookie。变量是session_destroy调用内存中仍然之后,但改变这些值没有影响(除非你再打电话session_start())。

    但代码片段也从内存中删除变量。例如,如果应用程序稍后在同一请求中检查$_SESSION['admin']以查看用户是否具有管理员权限,这一点很重要。

    session_start()函数是需要的,因为您需要首先加载会话才能删除它。

  3. 会话在不同的浏览器中不是持久的,但是它们在同一浏览器的所有窗口/选项卡上持续存在。如果关闭浏览器会发生什么情况,这取决于您的PHP-ini设置。 session.cookie_lifetime定义了浏览器应该保留cookie的时间(以秒为单位)(甚至在重新启动后)。如果session.cookie_lifetime设置为0,则浏览器在关闭时删除会话cookie。

    session.gc_maxlifetime定义的网络服务器多长时间保持会话文件(无会话文件中的会话cookie无效)

+0

有关问题2:你能澄清“基本够用”?如果足够你的意思是从内存中清除数据,我不认为需要用另一行代码复制这个动作。但是,如果你说它不从内存中清除,那么首先清空它是有意义的。关于问题3的 :当我关闭所有浏览器时,我得到一个新的会话ID。因此,由于推论的原因,当所有浏览器都关闭时,我会失去PHP使用的任何cookie - 因此它不再持久?谢谢。 – chaser 2012-07-31 13:22:15

+0

我编辑了我的答案,以澄清它 – MarcDefiant 2012-07-31 13:56:30

+0

@Morgria我仍然不确定问题2.我做了更多的测试,看来session_destroy不会立即清除数据。我能够在session_destroy之后仍然访问会话数据。但是,只要我刷新页面,会话数据就会被销毁。我注意到,在session_destroy之后,session_id未被设置,但会话数据仍然可以访问。 所以我只能得出结论:即时销毁数据,在运行时将其解除。而如果你的脚本在最后,那么session_destroy就可以做到。如我错了请纠正我。谢谢。 – chaser 2012-08-01 01:17:49

1

什么是文件全局变量是什么意思?

这是在谈论$_SESSION超级全局变量。

有什么不同的方式,我可以用来销毁会话 数据,是不是session_destroy足够?为什么要使用下面的编码 ,因为我已经看到了一些代码示例:

你用它来摆脱的$_SESSION的内容,这样的脚本的其余部分并没有使用现在过期数据。在脚本中的某个时刻,您已经决定清除用户的会话,因此您不希望任何其他逻辑使用该会话。通过将$_SESSION设置为空数组,其所有先前的内容都将被擦除。

这是永远为所有的浏览器呢?

是的,该会话基于cookie(通常)与特定用户相关联,并且每次用户访问该网站时(如果他们拥有cookie)都会发送到您的网站,而不管有多少标签是否打开或者他们是否使用标签式浏览。