替换PHP会话

时间:2009-09-17 22:19:36

标签: php mysql session memcached

我有一个社交网络类型的应用程序,我已经工作至少2年了,我需要它可以很好地扩展,所以我已经付出了很多努力来完善这个应用程序的代码。当用户登录到站点时,我经常使用会话来缓存用户的数据库结果我将用户ID号,用户名,urer状态/角色,照片URL,在线状态,上次活动时间以及其他一些内容缓存到会话变量/阵列。现在我目前有2个单独的服务器来处理这个站点,1个服务器用于apache webserver,还有一个单独的服务器用于mysql。现在我开始在某些领域使用memcache来减少数据库负载。

现在我的会话存储在磁盘上,我知道有些人使用数据库来存储会话数据,对我而言,如果我切换到存储会话,那么我从mysql缓存的会话数据似乎会失败的目的在mysql中。那我在这里错过了什么?为什么人们选择使用数据库进行会话?

以下是我的想法,使用会话数据库可以轻松存储和访问多个服务器的会话,这是使用数据库的主要原因吗?

我是否应该使用memcache来存储临时变量而不是将它们存储到会话中?

4 个答案:

答案 0 :(得分:2)

PHP 能够使用 memcached 来存储会话。

这可能只是你的中奖票。

看看this google search

答案 1 :(得分:2)

Zend Server软件包的一部分是会话守护程序。

为此目的小心使用memcache。一旦内存桶已满,它就会开始以FIFO方式丢弃内容。

slideshare上找到关于使用php-cli创建自己的会话服务器的信息。

答案 2 :(得分:1)

在数据库中存储会话的最佳理由是,您可以对网站进行负载平衡。这样,哪个服务器分发下一页并不重要,因为它们都使用相同的数据库来存储它们的会话。

查看PHP's set_save_handler()有关如何安装自定义会话处理程序的信息。设置一个会话需要大约30行才能将会话放入数据库中,尽管这不会将行计算为一个合适的数据库处理程序。 :-)你需要这样做:

ini_set('session.save_handler', 'user');
ini_set('session.auto_start', '0');

...虽然session.auto_start需要在你的php.ini中(并设置为0)。

如果数据库访问有点贵,那么您可以采取其他一些措施来缓解这种情况。显而易见的是,为会话提供 的数据库服务器。另一个技巧是让它在memcache和DB中都有东西,所以当它检查时,如果缺少memcache记录,它就会回落到DB。您也可以对此感到高兴,并将会话分开,因此其中一些是在memcache中,但其余部分存在于数据库中。我认为你需要在PHP的会话API之上放置自己的访问函数。

答案 3 :(得分:0)

将会话数据存储在数据库中的主要原因是安全性,否则您无法对其进行验证。您将会话ID与数据一起存储在数据库中并匹配它们以查看会话是否已被篡改,但您不能再使用服务器的(apache)默认会话机制。

对于在memcache中存储变量而不是会话..您是否设置了数据库查询缓存?我首先要看一下,因为它比使用memcache更容易处理。