2012-09-11 36 views
1

我想弄明白oldnavy.ca上的单页结帐系统。持久数据只能使用会话变量来实现吗?

如果你可以花时间把一些东西扔到购物车中,并弄乱周围,看看它是什么样子,我将不胜感激。

让我感到困惑的是刷新页面会保存进程的当前状态。所以,如果你创建你的登录名并添加你的送货地址,它将在那里,如果你点击刷新。

阅读很多文章听起来像使用会话变量来存储大量数据不被认为是很好的编程。现在,是存储表单数据,如航运信息等......认为“很多”的数据?

我只是好奇地想知道他们是如何实现这个购物车系统的,因为它在各地都有使用,而且我不想在会话变量使用的情况下不愿意使用它。

也许有替代品在使用?

谢谢

+0

他们不一定在SESSION中存储所有内容 - 他们可能会在其中存储唯一的ID,并将所有内容添加到数据库中。但是,确定它们是如何处理它的方法并不是真正的方法 - 从最终用户的角度来看它是一样的。 – andrewsi

+0

将它直接存储到数据库会更有效率吗?他们将不得不在会话过期时手动从数据库中删除数据。 – Adam

+0

如果他们这样做,他们会定期运行一些内容并清理尚未更新的会话 - 磁盘空间很便宜,并且在半夜运行批处理作业不会是大多数用户注意到。 – andrewsi

回答

0

有没有这个,只有指导方针的硬性和快速的答案。

如果您使用标准的PHP会话,它们将被保存在服务器磁盘上的纯文件中,每个活动会话一个。这也意味着在每个页面载入时,相关会话文件被从磁盘读取到内存中。 “太多”多少取决于很多因素......

  • 需要多长时间从磁盘读取文件到内存中?
  • 磁盘缓存可以防止每次物理磁盘访问,但文件越大,磁盘缓存中的文件越少
  • 在RAM中占用多少内存?
  • 将数据序列化并将其写回磁盘需要多长时间?
  • 你有多少并发用户需要PHP来读取和写入磁盘?
  • 活动会话有多长时间,即多少会话文件在被垃圾回收之前会在磁盘周围散落?

对于典型的小型网店(不是Amazon尺寸),答案是基于文件的会话通常非常好。您可能会在每个文件中存储几十KB的数据,这足以保存用户的地址数据和购物篮。你很难遇到这个问题。

另外还有简单的其他会话处理程序。您可以将它们保存在memcache存储或数据库中,这可以缓解许多基于文件的问题。评估哪种解决方案更适合您的情况。

+0

所以替代方法是保存会话ID并将所有关联的数据都存储在数据库中?我的下一个问题是如何在会话过期时删除这些数据?我的购物车的体积很小,因此Sessions对我来说可能更容易。 – Adam

+0

会话只是一个具有唯一ID和* some *服务器端机制的cookie,用于将数据存储在与该id关联的某个位置。如果你想使用基于非文件的会话存储,请查看['save_handler'](http://php.net/manual/en/session.configuration.php#ini.session.save-handler)。删除数据是所选会话处理程序的垃圾收集周期的一部分。 – deceze