PHP $ _SESSION能否在网站崩溃中幸存下来

时间:2014-09-16 21:24:06

标签: php session cookies shopping-cart

我知道这是一个非常模糊的问题,但我想知道$ _SESSION变量在压力方面能处理多少。如果$ _SESSION就像一个cookie,那么一旦用户从浏览器中清除了他或她的cookie,那么应该销毁$ _SESSION。另外,如果调用session_destroy(),那么$ _SESSION变量将被销毁。

是否有其他可以销毁$ _SESSION变量的实例,例如网站崩溃?如果PHP在网站上过载,它是否会直接影响$ _SESSION或任何其他功能以及处理它的变量,还是影响整体的一切?

我为什么要问? 我几乎已经为我的电子商务网站编写了一个废弃的购物车脚本,我想将客户重定向到他们的订单仍将保存在$ _SESSION中的网站。 $ _SESSION可以销毁的唯一方法是客户完成购买。当然,客户也可以在他或她的浏览器上清除cookie。

但是我想知道是否还有另一个实例,除了上面提到的那两个之外,$ _SESSION可以被销毁。

许多废弃的购物车系统将订单信息存储到数据库中,并将其包含在用户收到的电子邮件中,以便他们可以查看电子邮件中的订单。当然我可以将订单写入数据库,但是更容易将所有内容保留在$ _SESSION中并让客户返回到网站,其订单仍处于活动的$ _SESSION中。

$ _SESSION可以存活什么?

3 个答案:

答案 0 :(得分:1)

会话通常存储在磁盘上,位于session.save_path定义的目录中(通常为/tmp)。

加载PHP进程并运行session_start()时,会话将从磁盘上保存的版本恢复。当PHP进程正常终止(没有段错误等)时,会话的当前状态将被写回磁盘。

那么,会话有多大?限制是:

  • 序列化会话对象的磁盘大小(不应该成为问题)。
  • 处理:大型结构的反序列化和序列化占用了CPU资源。
  • 内存:巨大的$_SESSION变量占用了你记忆中的大量空间。 (您可能需要增加memory_limit。)

还有另外一个重要的其他情况(除了你提到的情况)会删除会话,它是垃圾收集。根据服务器的设置方式,后台作业每隔几分钟会遍历所有会话,并删除过期的作业。或者每次对PHP的 x th 调用都会触发GC(不会详细说明,因为它们在这里无关紧要)。默认的到期时间取决于您的PHP版本和操作系统供应商,但通常在30分钟到1小时之间。

如果您有购物应用程序,则可能需要增加会话的到期时间,为session.gc_maxlifetime设置适当的值。

答案 1 :(得分:1)

会话变量保存到您的服务器。默认情况下,我的dev服务器位于/ var / lib / php / sessions中。但是我使用的框架完全不同地处理它们,因此实际使用的会话变量位于应用程序文件夹中。

即使重启后,这些仍然存在。但是在重新启动时在/ tmp文件夹中使用php默认会话所有用户都必须重新登录..这取决于你的操作系统,但大多数/全部将在重新启动时清理/ tmp。

检查你的session.save_path,确保它们没有保存在/ tmp和session.gc_maxlifetime中,以确保它们不会过期。如果没有设置,则使用系统的php默认值,您必须查看。

答案 2 :(得分:-1)

  1. 可以使用PHP或任何其他服务器端语言销毁会话。
  2. 会话将在闲置24分钟后销毁(默认情况下为PHP)
  3. 如果不使用持久性cookie进行会话,会在关闭浏览器时销毁会话。
  4. 此外,服务器崩溃后,会话通常不会失效。在大多数情况下,PHP和GC甚至不知道服务器崩溃了。如果UA发送了有效的cookie并且在磁盘上找到了会话,则可以继续进行,而不会出现问题,如lyx所示