60

我正在使用负载均衡器后面的几个 Web 服务器,我可以启用粘性会话以将用户保留到一个特定的 Web 服务器 - 这将起作用。

我一直在阅读有关 PHP Sessions 和 MemCache 的信息。我必须说我读到的内容有点令人困惑,因为有些页面说这是个好主意,而另一些则相反。

问题:

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

4 回答 4

68

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

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

Memcached 专为会话而设计。它最初是 livejournal.com 的首席开发人员的创意,后来也用于缓存用户帖子的内容。好处是立竿见影的:大部分动作都发生在记忆中。页面加载时间大大改善。

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

以 Debian 为例:

sudo apt-get -t stable install php7.4-memcached

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

(取自https://www.php.net/manual/en/memcached.sessions.php

 session.save_handler = memcached
 ; change server:port to fit your needs...
 session.save_path = "localhost:11211"

关键是 session.save_path

它将不再指向您服务器上的相对文件路径。提到了 APC - APC 用于缓存程序使用的 .php 文件。APC 和 Memcached 将显着减少 IO 并使 Apache/Nginx 更快地释放给服务器资源,例如图像。

2: 没有

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

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

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

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

于 2012-12-19T05:57:48.340 回答
9

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

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

2. 内存缓存/粘性会话

我真的不知道哪个“更好”。我觉得这将是那些“视情况而定”的答案之一。这可能取决于您进行负载平衡的原因。如果少量用户导致每个负载很大,或者如果它是一个很大的数量导致每个负载很小。

3. Memcache 的缺点

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

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

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

于 2012-12-19T05:58:04.570 回答
5

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

Google 的大多数网络资源都基于 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

于 2017-08-28T06:41:23.843 回答
2

根据我的观点,不建议将会话存储在 Memcached 中。如果会话消失,通常用户会注销,如果缓存的一部分消失或由于硬件崩溃,它不应该给您的用户带来明显的痛苦。根据memcached 网站,“memcached 是一种高性能的分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态 Web 应用程序。” 因此,在开发应用程序时,请记住,一旦在 Memcached 服务器中找不到数据,您必须有一个备用机制来检索数据。

于 2013-10-17T13:22:29.540 回答