我正在使用负载均衡器后面的几个Web服务器,我可以启用Sticky Sessions来将用户保存到一个特定的Web服务器 - 这将起作用。
我一直在阅读关于PHP Sessions&内存缓存。我必须说我读到的内容令人困惑,因为有些网页说它是个好主意,而其他网页则相反。
问题:
答案 0 :(得分:62)
1:是的。我强烈建议在Memcached中存储PHP会话。原因如下:
Memcached非常适合存储数据库和文件系统经常访问的小块数据。
Memcached专为会话而设计。它最初是livejournal.com的首席开发人员的心血结晶,后来也用于缓存用户帖子的内容。好处很直接:大部分行动发生在记忆中。页面加载时间大大改善。
值得庆幸的是,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
它将不再指向服务器上的相对文件路径。 提到了APC-APC用于缓存程序使用的.php文件。 APC和Memcached将显着降低IO,让Apache可以更快地为图像等资源提供服务。
2: 否
3: 使用Memcached的根本缺点是数据波动性
会话数据在Memcached中不是持久的。因此,如果服务器崩溃,内存中的所有数据都将丢失。每个人都必须重新登录。
然后你有记忆消耗......
请记住:会话存储在内存中。如果您的网站处理大量并发用户,您可能需要多花一点钱来进行更大的内存分配。
答案 1 :(得分:7)
memcache扩展甚至附带了一个会话处理程序,它只需很少的配置即可启动和运行。 http://php.net/manual/en/memcached.sessions.php
我真的不知道哪个“更好”。我觉得这将成为“依赖”的答案之一。这可能取决于您负载平衡的原因。如果少数用户每次都会造成大量负载,或者每个用户造成的负载很小,那么就会产生大量负载。
使用memcache进行会话存储可能有两个主要缺点。
首先,它是不稳定的。这意味着,如果您的某个memcached实例重新启动/崩溃等,则该实例中存储的任何会话都将丢失。如果他们使用传统的基于文件的会话,那么当服务器返回时,它们仍将存在。
其次可能更相关,memcached不保证持久性,它只是一个缓存。无论出于何种原因,都可以随时从memcached中清除数据。实际上,应该清除数据的唯一原因是缓存是否接近其大小限制。最近访问的数据将被驱逐出去。同样,这可能不是问题,因为如果用户的会话过时,用户可能会离开,但这取决于您的需求。
答案 2 :(得分:3)
如果你想使用" memcacheD"延伸不" memcache" (有两种不同的扩展名)用于会话控制,你应该注意修改 php.ini 。
来自Google的大多数网络资源都基于内存缓存,因为它的版本早于memcacheD。他们会说如下:
session.save_handler = memcache session.save_path =" tcp:// localhost:11211"
但是当涉及到memcacheD时,它无效。
您应该像这样修改php.ini:
session.save_handler = memcached session.save_path =" localhost:11211"
没有协议标识符。
答案 3 :(得分:2)
根据我的观点,不建议在Memcached中存储会话。如果会话消失,用户通常会被注销,如果缓存的一部分消失或由于硬件崩溃,它不应该导致用户明显的痛苦根据memcached网站,“memcached是一个高性能的分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态Web应用程序。”因此在开发应用程序时,请记住一旦在Memcached服务器中找不到数据,就必须有一个回退机制来检索数据。