【问题标题】:Is it okay to save lots of information in $_SESSION?是否可以在 $_SESSION 中保存大量信息?
【发布时间】:2011-08-17 21:08:36
【问题描述】:

我需要在$_SESSION 中存储许多数组,以防止从 MySQL 中检索信息。没事吧? $_SESSION 中的“太多”信息是多少,或者没有“太多”?谢谢。

附:还是用http://php.net/manual/en/book.memcache.php比较好?

【问题讨论】:

  • “许多”数组是什么意思? 1、10 100、1k 还是 100k?
  • @Charliepiga:我猜最多 100 个。

标签: php mysql session memcached


【解决方案1】:

您可以在会话中存储的数据的限制受会话存储层的限制。默认会话存储是文件系统,一个会话存储到一个文件中。会话变量/数组键的名称及其数据都存储在serialized form 中。管道符号将变量名称和值相互分隔。

如果您使用字符串存储数组,那么文件的大小将与字符串长度加上键的长度以及元数据的少量开销以及变量名的大小相近。

文件的大小受文件系统的限制。例如,在 EXT3 中,每个文件 16 GB。所以这是一个“太多”。您不能将比存储层允许的更多数据存储到会话中。

我能想到的下一个限制是你的记忆。由于 PHP 需要将文件中的数据加载到内存中,并在请求结束时将其从内存中存储到文件中。因此,如果您有memory limit in PHP,那么这实际上也会限制您的会话大小。例如,PHP 5.2 中有 16MB 的标准内存限制,但这可能会因您的安装而异。

顺便说一句,仅将整个内存用于会话并没有多大意义。

除了这些硬限制之外,可能还有与并发请求数量、硬盘速度等相关的性能限制。

由于您的问题很短,我假设您到目前为止没有遇到任何具体问题,所以我认为这超出了范围。例如。如果您真的不需要,使用 memcached 只是开销。以及讨论根本无法回答的设计决策(从不在会话中缓存)。

每个会话 100 或 200 KB(在您的系统上找到会话目录并实际查看文件的大小)不应破坏您的程序。正如建议的那样,您应该注意在一段时间后自动删除不再需要的旧会话文件。

要了解有关 PHP 会话配置的更多信息,请参阅 Session Runtime Configuration in the PHP Manual

【讨论】:

    【解决方案2】:

    您要问的很多问题取决于您期望有多少用户以及您使用的硬件类型。假设您的 PHP 配置使用文件存储会话信息(默认),并且您有足够的 tmp 空间,则可以在会话中存储相当大的数据块。

    我个人在会话中存储了十几个数据对象(通常是与用户相关的数据库结果)。该站点位于公司 Intranet 上,每小时服务大约一万个请求。它速度快,负载低。如果我不得不猜测每个会话接近 100KB。

    我不建议在会话中存储超过一兆字节或两兆字节。您还需要确保 PHP 和 Apache(IIS 等)也在自行清理。如果您存储大量会话数据,临时空间会很快填满。

    如果您真的想快速制作这样的东西,并且有足够的现金,请选择 SSD 磁盘驱动器。这将使检索更快。

    希望这会有所帮助。

    【讨论】:

    • 小心 SSD,Jeff Atwood (@CodingHorror) 有一篇关于 SSD 和故障率的精彩博文...codinghorror.com/blog/2011/05/…
    • 同意。他们只有这么多的写周期。我不建议将 SSD 用作设备的主驱动器(除非设备是可消耗的),并且始终保留存储在驱动器上的任何您不能松动的东西的备份(当然,无论如何这是一个好习惯)。
    【解决方案3】:
    【解决方案4】:

    $_SESSION 用于缓存。

    如果您需要缓存内容,请使用 APCMemcached 甚至 Redis

    【讨论】:

    • “Memcache 模块还提供了一个会话处理程序(memcache)。” - PHP 手册。只是说...
    • 这个答案没有解释为什么,这就是问题所要问的。
    • @tandu 因为您应该缓存必须可供多个用户使用的内容。会话没有提供。如果您必须为每个单个用户存储 100 多个数组,那么问题就出在应用程序设计中,“在 $_SESSION 中保存东西”只是一种廉价且不可持续的技巧。
    • 我不知道为什么这个答案在完全偏离主题的情况下得到这么多分数。他要求存储数据,memcache 和 session 都可以做到这一点。真正的答案是:哪一个?你只是在回答一个明显的声明。
    • @teresko 我在这里对缓存的定义存在差异。如果您在一个会话中存储 100 多个数组,则数量不多,尤其是与在每次页面加载时从数据库中检索这 100 多个数组相比(否则您必须这样做)。 APC、memcached 等是否为用户在本地存储这些信息提供了优越的机制? @Charliepiga 似乎说 memcached 有这样一个模块。
    【解决方案5】:

    会话中的数据量会对性能产生影响。如果您打算将文件用于会话,请注意 php 可能会遇到磁盘瓶颈。读取、写入和序列化该数据可能会导致大量磁盘 i/o,这很糟糕。

    至于硬上限,我怀疑这些限制与您的文件系统的相同。例如,如果您将大量数据保存到会话中,并且您的磁盘已满,您将无法编写额外的会话。

    使用 memcached 将缓解磁盘 i/o 性能问题,因为从 memcached 写入和读取的速度要快得多。根据 memcached 规范,您的限制将是每个会话 1MB。您的会话总空间将是您启动的 memcache 实例的大小(由启动 memcache 实例时的 -m 标志决定)。

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2011-09-22
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2020-12-28
      • 1970-01-01
      • 2013-05-14
      相关资源
      最近更新 更多