是否建议在MemCache中存储PHP会话?

Ada*_*dam 51 php memcached

我正在使用负载均衡器后面的几个Web服务器,我可以启用Sticky Sessions将用户保存到一个特定的Web服务器 - 这将起作用.

我一直在阅读有关PHP Sessions和MemCache的内容.我必须说我读过的内容令人困惑,因为有些网页说它是个好主意,而其他网页则相反.

问题:

  1. 是否可以在memcache中保持php会话?
  2. 在memcache上使用粘性会话更好吗?
  3. 在memcache中php会话有什么问题 - 注意:我可以获得足够的缓存(亚马逊因此可扩展).

Fre*_*Guy 63

1:是的.我强烈建议在Memcached中存储PHP会话.原因如下:

Memcached非常适合存储数据库和文件系统经常访问的小块数据.

Memcached专为会话而设计.它最初是livejournal.com的首席开发人员的心血结晶,后来也用于缓存用户帖子的内容.好处很直接:大部分行动发生在记忆中.页面加载时间大大提高.

值得庆幸的是,PHP和Apache有一个简单的实现来处理与Memcached的会话.只需安装一些shell命令即可

debian的例子:

sudo apt-get -t stable install php5-memcached
Run Code Online (Sandbox Code Playgroud)

将您的php.ini设置更改为类似于:

(摘自http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/)

 session.save_handler = memcache
 ; change server:port to fit your needs...
 session.save_path="tcp://server:port?persistent=1&weight=1&
timeout=1&retry_interval=15"
Run Code Online (Sandbox Code Playgroud)

关键是session.save_path

它将不再指向服务器上的相对文件路径.提到了APC-APC用于缓存程序使用的.php文件.APC和Memcached将显着降低IO并使Apache免费提供更快的服务资源,如图像.

2:

3: 使用Memcached的根本缺点是数据易变性

会话数据在Memcached中不是持久的.因此,如果服务器崩溃,内存中的所有数据都将丢失.每个人都必须再次登录.

然后你有内存消耗......

请记住:会话存储在内存中.如果您的网站处理大量并发用户,您可能需要多花一点钱来进行更大的内存分配.

  • 我发布这个答案已经有几年了,值得注意的是,有一个强大的扩展会话替代方案:Redis.PHP有一个很好的插入式解决方案,称为Predis库,实现只需几分钟,几乎与上面的Memcached解决方案一样简单. (5认同)
  • 我同意可怕的代码,这取决于可用性,Redis可能是更好的解决方案.但这取决于正在使用的软件堆栈恕我直言.对于我们来说,由于PHP的内置会话变量在我们的应用程序中,我们倾向于使用Memcache和Redis.Redis用作产品密钥查找.它由设计,遗留支持和组织完成.Redis可以很容易地用于所有事情. (2认同)
  • 还要记住,有一个警告:会话锁定不适用于 memcached,这意味着您可能会遇到竞争条件.. (2认同)

Bre*_*ker 7

1.是的,可以将PHP会话保存在memcached中.

memcache扩展甚至带有一个会话处理程序,它只需很少的配置即可启动和运行.http://php.net/manual/en/memcached.sessions.php

2. Memcache/Sticky Sessions

我真的不知道哪个更"好".我觉得这将成为"依赖"的答案之一.这可能取决于您负载平衡的原因.如果少数用户每个都会造成大量负载,或者如果大量用户导致每个负载较小.

3. Memcache的缺点

使用memcache进行会话存储可能有两个主要缺点.

首先,它是不稳定的.这意味着,如果您的某个memcached实例重新启动/崩溃等,则该实例中存储的任何会话都将丢失.如果他们使用传统的基于文件的会话,那么当服务器返回时它们仍将存在.

其次,可能更相关,memcached不保证持久性,它只是一个缓存.无论出于何种原因,都可以随时从memcached中清除数据.实际上,应该清除数据的唯一原因是缓存是否接近其大小限制.最近访问的数据将被驱逐出去.同样,这可能不是问题,因为如果用户的会话过时,用户可能已经离开,但这取决于您的需求.

  • 是,我确定.至少在其正常配置中.Memcached仅将数据存储在内存(RAM)中.如果重新启动计算机,甚至只是服务,它将丢失.它被设计为缓存,而不是持久存储.如果你需要持久性,其他选项,如memcacheDB,redis或许多其他更传统的数据库(如MySQL)也可以用于会话(请查看答案http://stackoverflow.com/questions/1316852/alternative-to-memcached -that-c​​an-persist-to-disk - 这是一个Java问题,但许多(大多数/全部?)答案仍然适用) (2认同)

小智 5

如果要使用“memcacheD”扩展名而不是“memcache”(有两种不同的扩展名)进行会话控制,则​​应注意修改php.ini

大多数来自 Google 的网络资源都基于 memcache,因为它的版本比 memcacheD 早。他们会说如下:

session.save_handler = memcache 
session.save_path = "tcp://localhost:11211" 
Run Code Online (Sandbox Code Playgroud)

但是当涉及到 memcacheD 时它是无效的。

你应该像这样修改 php.ini :

session.save_handler = memcached 
session.save_path = "localhost:11211" 
Run Code Online (Sandbox Code Playgroud)

没有协议标识符。

来自:http : //php.net/manual/en/memcached.sessions.php#99646