2014-02-14 29 views
1

我已经看到很多类似的溢出问题,但他们都没有真正解决我的情况,因此我打开这个问题。替代巨大的Codeignitor会话数据

我正在一个项目中有成千上万的MP3曲目和混音数据库。每个mp3文件都有一个id和数据库的相关信息。现在正在构建购物车,用户可以选择轨道并添加到购物车。当一个轨道被添加到购物车时,它的ID被存储在会话中,并且工作正常。

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

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

我尝试使用数据库[MySQL的],它不仅速度慢,但也有一些问题,如每个新用户需要有一个行添加到数据库表,如何清除这些表在使用后..等等等等

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

我需要一个本地的跨平台解决方案。我已经完成了很多研究,并没有找到可靠的解决方案。

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

+0

是否有某些原因,您不希望将购物车的实际内容存储在数据库中,按会话或用户名进行键控,并且只在cookie中携带最少的会话信息? –

+0

我了解到问题是由Codeignitor会话而不是本机PHP会话引起的。由于Codeignitor会话基本上是一个cookie。它具有cookie的所有限制。 –

回答

0

使用原生的PHP会话是将正确的方式,为各位用户只回答了ID上的cookie一个PHP会话商店,但codeignitor行为不同,它将所有数据存储到cookie,这是捕获的地方。

移动到正常的PHP会话是一个痛苦,因为我必须改变整个项目的代码。经过一些研究和测试,我得出结论认为[CI的本地会话库] [1]

Derek Jones [1]:https://github.com/EllisLab/CodeIgniter/wiki/Native-session是一个很好的替代方案,它使用相同CI会话在CI上使用PHP会话函数和语法。

因此得出结论,无论是从头开始使用PHP会话还是使用此库作为克服CI会话大小限制的替代方案。

0

为什么不尝试setcookie()函数在PHP? 您可以在cookie中存储所需数量的数据,并将参考的参考存储在数据库中!希望你能理解我的答案!

+1

我的问题是具体的,我知道如何设置一个会话。这里的问题是大量的会话数据。如果您阅读了更多有关会话的内容,您可以了解它只是简单的Cookie,并且它们有局限性。 –

+0

哦,很好,明白了你的观点 –

1

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

在这种情况下,会话存储全部在服务器端完成,所以4k限制不适用。看看你的HTTP标头的请求时,你只能看到这样的事情:

Set-Cookie: PHPSESSID=1234abcde56789f 

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

0

miken32说的是正确的。如果您使用Codeigniter,则设置会话数据库表并使用codeigniter会话。如果你使用一个数据库表,然后它只是一个ID设置在cookie。请确保并从官方codeigniter会话数据库表开始,以便它能正常工作。

codeigniter会话类已内置'垃圾回收'。

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

+0

我并不完全同意这种说法,codeignitor会话是一个cookie ..阅读“什么是会话数据?”在您提供的链接中。因此Codeignitor会话具有cookie的所有限制。当您使用CI会话类时,不仅id和变量都存储在用户cookie中。 –

+0

如果您不使用默认的数据库表,那么您是正确的。但是如果您使用数据库表,那么只有会话ID存储在cookie中。直接引用:“一旦启用,Session类将会话数据存储在数据库中。”重要 - 除了设置正确的数据库表之外,您还必须在config/config.php文件中设置会话值。 – cartalot

+0

你错误地解释了这个陈述。然而现实却远非如此。通过启用数据库,它不仅将会话数据存储在cookie中,而且还存储在数据库中。数据库的目的仅用于会话验证。通过加密会话,我为会话增加了额外的负担,因为加密会话的尺寸比正常会话大。虽然我的要求是在CI会话中存储大量数据。 –