使用缓存系统进行会话存储?

时间:2011-02-05 15:04:42

标签: php caching session memcached

假设我有一个可用于存储会话的缓存系统:

// example i have a cache class
$memcached->add('key','value');
// then i can get the session from
$memcached->get('key');

使用缓存(例如memcached,也许Redis可以适用于会话而不是使用PHP的内置会话,有什么优点和缺点?)

2 个答案:

答案 0 :(得分:4)

我想从澄清开始。当您使用PHP会话存储时,会话将存储在一个文件中(通常在/ tmp中)。每个会话都成为它自己的文件。

当您使用memcached或redis存储会话时,PHP代码中的任何内容都不会更改。

您可以简单地配置php以使用redis或memcache来存储会话(通过php.ini中的会话保存处理程序配置)。

优点:

  • 会话存储/检索变得快得多

缺点:

  • 您需要配置php.ini(或自己实现会话保存处理程序)

现在,我实际上建议使用redis而不是memcache,因为会话将成为永久性的,所以如果你需要重新启动服务器,你的所有用户都不会被注销。

对于redis: https://github.com/owlient/phpredis(请参阅页面下方的“会话处理程序”)

答案 1 :(得分:3)

通过将session.save_handler设置为mm,您应该能够在Apache的运行时内存中拥有PHP存储会话数据。但是,为此,您需要使用内存管理模块(--with-mm)编译PHP,我认为这不适用于Windows。

如果您想使用memcached或其他一些缓存机制,那么最好使用session_set_save_handler实现用户定义的存储处理程序,这样您就不必重写会话管理代码。

如果你这样做,那么我认为以这种方式存储会话数据没有任何明显的缺点。明显的优势是速度。

修改 我遇到了this page,除了速度之外,还讨论了使用memcached存储会话的主要优点/缺点,即:

  • 在不使用粘性会话的情况下,可以轻松地跨多个Web服务器共享会话。
  • 但是,memcached没有承诺在到期前保持数据 - 只是在到期后数据可用。因此,如果memcached在ram上较低,最近没有使用过,或者服务器完全失效,那么会话数据将会丢失。