【问题标题】:Alternative to Huge Codeigniter session data巨大的 Codeigniter 会话数据的替代方案
【发布时间】:2014-02-14 04:13:29
【问题描述】:

我在溢出中看到了许多类似的问题,但没有一个真正解决了我的情况,因此我打开了这个问题。

我正在从事一个项目,其中有数千个 mp3 曲目和混音的数据库。每个 mp3 文件都有一个 id 和有关数据库的相关信息。现在正在以用户可以选择曲目并添加到购物车的方式构建购物车。当将曲目添加到购物车时,其 id 会存储在会话中,并且可以正常工作。

现在,当会话中存储大量 id 时,问题就来了。一个会话是一个 cookie [codeignitor],我知道它有 4kb 的存储空间。

保存这些数据的最佳做法是什么?我知道我必须改变我的策略并停止使用会话。

我尝试使用数据库[mysql],它不仅速度较慢而且有几个问题,比如每个新用户需要在数据库表中添加一行,使用后如何清除这些表......等等等等。

我尝试使用 memcached,但我认为这不是正确的选择,因为我尝试存储的数据并没有那么大。 memcached 在 windows 平台上也有几个问题,前提是我不确定客户端是否会将它部署在 linux/windows 服务器上。

我需要一个原生的跨平台解决方案。我做了很多研究,但还没有找到可靠的解决方案。

我使用 codeigniter 框架,因此您可以建议任何 PHP 或 codeigniter 解决方案,非常感谢。

【问题讨论】:

  • 是否有某些原因您不想将购物车的实际内容存储在数据库中,以会话或用户名为关键字,并且只在 cookie 中携带最少的会话信息?跨度>
  • 我了解到问题是由 Codeignitor 会话而不是本机 PHP 会话引起的。由于 Codeignitor 会话基本上是一个 cookie。它具有 cookie 的所有限制。

标签: php database codeigniter session optimization


【解决方案1】:

您谈到“在会话中”存储东西,所以我假设您使用的是 PHP 的会话处理程序,而不是单独设置 cookie。

在这种情况下,会话存储全部在服务器端完成,因此 4k 限制不适用。在请求期间查看您的 http 标头,您只会看到如下内容:

Set-Cookie: PHPSESSID=1234abcde56789f

此会话 ID 指的是一个文件(通常存储在一个目录中,例如 RHEL 发行版上的 /var/lib/php/session/),其中包含作为序列化 PHP 对象的实际数据。

【讨论】:

    【解决方案2】:

    你为什么不在 php 中尝试 setcookie() 函数呢? 您可以在 cookie 中存储尽可能多的数据,并将会话的引用存储在数据库中! 希望你能理解我的回答!

    【讨论】:

    • 我的问题很具体,我知道如何设置会话。这里的问题是大型会话数据。如果您阅读有关 session 的更多信息,您可以理解它只是 cookie,它们有局限性。
    【解决方案3】:

    miken32 所说的是正确的。如果您使用的是 Codeigniter,则设置一个会话数据库表并使用 codeigniter 会话。如果您使用 db 表,那么 它只是在 cookie 上设置的 id。一定要从官方的 codeigniter session db table 开始,这样它才能正常工作。

    codeigniter 会话类已内置“垃圾收集”。

    所有解释都在这里,向下滚动到数据库部分: http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

    【讨论】:

    • 我不完全同意这种说法,codeignitor 会话是一个 cookie.. 阅读“什么是会话数据?”在您提供的链接中。因此,codeignitor 会话具有 cookie 的所有限制。当您使用 CI 会话类时,不仅 id,而且变量都存储在用户 cookie 中。
    • 如果您不使用默认的数据库表,那么您是正确的。但是,如果您使用数据库表,那么只有会话 ID 存储在 cookie 中。直接引用:“一旦启用,会话类将在数据库中存储会话数据。”重要 - 除了设置正确的数据库表之外,您还必须在 config/config.php 文件中设置会话值。
    • 您误解了该声明。然而现实远非如此。通过启用数据库,它不仅将会话数据存储在 cookie 中,还存储在数据库中。数据库的目的仅用于会话验证。通过加密会话,我增加了会话的额外负担,因为加密会话的大小比正常会话大。虽然我的要求是在 CI 会话中存储大量数据。
    • 我正在尝试使用 PHP 本机会话但使用相同 CI 语法的 CI 本机会话类。也许这可能是一个正确的解决方案。
    【解决方案4】:

    使用原生 PHP 会话是正确的移动方式,因为其他用户回答了 php 会话仅将 id 存储到 cookie,但 codeignitor 的行为不同,它将所有数据存储到 cookie,这就是问题所在.

    继续正常的 PHP 会话很痛苦,因为我必须更改整个项目的代码。经过一些研究和测试,我得出一个结论,[Native Session library for CI][1]

    [1]:Derek Jones 的https://github.com/EllisLab/CodeIgniter/wiki/Native-session 是在 CI 上使用 PHP 会话的绝佳替代方案,具有相同的 CI 会话功能和语法。

    所以总结一下,要么从头开始使用 PHP 会话,要么使用这个库作为替代方案来克服 CI 会话大小限制。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2018-01-15
      • 2020-08-17
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多