【问题标题】:Replace PHP Sessions替换 PHP 会话
【发布时间】:2009-09-17 22:19:35
【问题描述】:

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

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

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

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

【问题讨论】:

标签: php mysql session memcached


【解决方案1】:

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

这可能就是你的中奖票。

看看this google search

【讨论】:

    【解决方案2】:

    Zend Server 包的一部分是会话守护进程。

    为此目的使用内存缓存时要小心。一旦内存桶满了,它就会开始以先进先出的方式丢弃东西。

    slideshare 上找到这个关于使用 php-cli 创建自己的会话服务器的内容。

    【讨论】:

    • 这就是为什么我不建议在会话中使用 memcache。人们不喜欢退出,因为缓存空间不足。 :-)
    【解决方案3】:

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

    查看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 中,而其余的则存在于数据库中。不过,我认为您需要将自己的访问函数放在 PHP 的会话 API 之上。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多