【问题标题】:can a PHP $_SESSION survive a website crashPHP $_SESSION 能否在网站崩溃中幸存下来
【发布时间】:2014-11-10 18:54:00
【问题描述】:

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

是否存在其他可以破坏 $_SESSION 变量的情况,例如网站崩溃? 如果网站上的 PHP 重载,它是否必须直接影响 $_SESSION 或任何其他功能和处理它的变量,还是它会影响整体?

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

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

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

$_SESSION 能维持什么?

【问题讨论】:

  • 在销售方面更容易成为最佳解决方案?
  • 没有理由不这样做,除非您的网站崩溃是由磁盘崩溃引起的(默认会话处理是基于文件系统的)...但是如果您有注册用户,您持有会话的时间越长数据(特别是如果他们的会话被“登录”)该会话被劫持的风险就越大
  • @KaiQing 这是一个很好的观点,这就是我仍在辩论的原因。但是,如果 $_SESSION 在为每个客户实施废弃购物车系统时始终存在,那么我不明白为什么不应该使用它。
  • 是的,但是会话仍然可以过期,所以即使它在崩溃之后仍然存在,你仍然有可能丢失它。就个人而言,我可能也会参加会议,因为如果在一天左右的时间内没有恢复废弃的购物车,它们通常不会恢复。如果没有注册活动,每个所有者都有自己的想法,即购物车应该使用多长时间。我会给它 2 个小时。
  • @KaiQing 当然我不会让 SESSION 永远存在。我正在考虑让 SESSION 存在一个月并在特定时间继续发送电子邮件,直到客户购买某些东西或一个月结束。

标签: php session cookies shopping-cart


【解决方案1】:

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

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

那么,一个会话可以有多大?限制是:

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

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

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

【讨论】:

    【解决方案2】:

    会话变量保存到您的服务器。我的默认位于我的开发服务器的 /var/lib/php/sessions 中。然而,我使用的框架对它们的处理方式完全不同,因此实际使用的会话变量位于应用程序文件夹中。

    即使在重新启动后它们仍然存在。但是,在重新启动时在 /tmp 文件夹中使用 php 默认会话,所有用户都必须重新登录。这再次取决于您的操作系统,但大多数/所有人将在重新启动时清除 /tmp。

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

    【讨论】:

      【解决方案3】:
      1. 可以使用 PHP 或任何其他服务器端语言销毁会话。
      2. 会话在空闲 24 分钟后将被销毁(默认为 PHP)
      3. 如果不使用持久性 cookie 进行会话,则关闭浏览器时会话将被销毁。
      4. 此外,会话通常不会在服务器崩溃后失效。大多数情况下,PHP 和 GC 甚至都不知道服务器崩溃了。如果 UA 发送了一个有效的 cookie 并且在磁盘上找到了会话,那么它可以继续没有问题,正如 lyx 所建议的那样

      【讨论】:

      • 这些是唯一会破坏 $_SESSION 的实例吗?
      • 是的。在网站崩溃的情况下,如果您正在重新启动 Web 服务器,会话 ID 将自动失效,会话将被视为已销毁。
      • 那么垃圾回收呢?
      • 此外,会话通常不会在服务器崩溃后失效。大多数情况下,PHP 和 GC 甚至都不知道服务器崩溃了。如果 UA 发送了一个有效的 cookie 并且在磁盘上找到了会话,那么它可以继续没有问题。
      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2015-05-25
      相关资源
      最近更新 更多