build议将PHP会话存储在MemCache中吗?

我正在使用负载均衡器后面的一些Web服务器,我可以启用粘滞会话来将用户保存到一个特定的Web服务器 – 这将起作用。

我一直在阅读关于PHP会话和MemCache。 我必须说,我读过的东西是一种混乱,因为一些网页说这是一个好主意,而另一些则相反。

问题:

  1. 是否有可能保持PHP会话在memcache?
  2. 通过memcache使用粘性会话更好吗?
  3. memcache中的php会话有什么问题 – 注意:我可以获得足够的caching(亚马逊,因此它的可扩展性)。

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

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

Memcached是专门为会议devise的。 它最初是livejournal.com首席开发人员的心血结晶,后来也用来caching用户post的内容。 好处是立竿见影的:大部分的行动都是在记忆中进行的。 网页加载时间大大提高。

谢天谢地,PHP和Apache有一个简单的实现来处理与Memcached的会话。 只需使用几个shell命令即可安装

debian的例子:

sudo apt-get -t stable install php5-memcached 

改变你的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" 

关键是session.save_path

它将不再指向您的服务器上的相对文件path。 提到APC – APC用于caching程序使用的.php文件。 APC和Memcached将显着减lessIO,并使Apache免费为资源(如图像)提供更快的服务。

2: 没有

3: 使用Memcached的根本缺点是数据波动

会话数据在Memcached中不是持久的。 因此,如果服务器崩溃,内存中的所有数据都将丢失。 每个人都必须重新login。

然后你有内存消耗…

记住:会话存储在内存中。 如果你的网站处理大量的并发用户,你可能不得不多花一点钱来分配更大的内存。

最后,延迟(不愚蠢)

这一切都是透视的除非您打算将所有操作保留在一台机器上,否则最终将通过服务器networking扩展您的memcached群集。 (这是水平扩展)当没有用适当数量的硬件来处理负载需求时,延迟会对性能和吞吐量产生显着影响。

例如,我的Amazon EC2实例的延迟时间大约为80毫秒,在我的应用程序中最昂贵的操作需要大约70毫秒来执行和caching单个页面。 一些最快的页面用了1-2毫秒,但是现在用了80毫秒的惩罚81毫秒。 所以不要以为增加2个服务器会使我的容量“三倍”,我就错了。 5-10台服务器,也许? 升级后没有确定最佳数量的公式,因为要知道的唯一方法就是测量stream量,并在需要时启动新的服务器。 另一个$$$的考虑,但你可以在便宜的范围内扩展到无穷大,因为获得更多的带宽与更多的硬件一直是容易的部分!

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

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

2. Memcache /粘滞会话

我不知道哪个“更好”。 我觉得这将是其中一个“这取决于”的答案。 这可能取决于您的负载平衡原因。 如果less数用户每个都会造成大量负载,或者每个用户负载较大,则负载很大。

3. Memcache的缺点

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

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

其次,也许更相关,memcached不保证持久性,它只是一个caching。 数据可以随时从memcached中清除,出于任何原因。 而实际上,数据应该被清除的唯一原因是caching接近其大小限制。 最近最less访问的数据将被驱逐。 再一次,这可能不是一个问题,因为如果用户的会话过时,用户可能会离开,但这取决于您的需求。

作为我的观点,不build议将会话存储在Memcached中。如果会话消失,通常用户将被注销。如果某个caching的一部分消失或者由于硬件崩溃,应该不会导致用户的痛苦。根据memcached网站“,memcached是一个高性能,分布式的内存对象caching系统,通用性,但是用于通过减轻数据库负载来加速dynamicweb应用。”所以,在开发你的应用程序时,记住你必须有一个一旦在Memcached服务器中找不到数据,回退机制就可以检索数据。

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

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

session.save_handler = memcache session.save_path =“tcp:// localhost:11211”

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

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

session.save_handler = memcached session.save_path =“localhost:11211”

没有协议标识符。

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