【问题标题】:PHP sessions not working with memcachedPHP 会话不适用于 memcached
【发布时间】:2017-07-30 09:43:16
【问题描述】:

我正在尝试设置 memcached 以允许在 2 个负载平衡的 Apache 服务器上进行会话共享 - 在我的 php.ini 中我有:

节点 1

session.save_handler = memcached
session.save_path = "tcp://NODE1_IP:11211"

和

节点 2

session.save_handler = memcached
session.save_path = "tcp://NODE2_IP:11211"

在 /etc/sysconfig/memcached 中,我有:

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1"

在 phpinfo 我有:

session.save_handler    memcached   memcached
session.save_path   tcp://NODE1_IP:11211    tcp://NODE1_IP:11211

当我登录到我的应用程序时,我在登录页面和检查用户是否登录的页面上有 session_start,但是当我:

print_r($_SESSION);

没有显示任何内容,因为会话看起来没有设置。

值得注意的是,在 phpinfo 中,我在 session 部分的顶部看到了这些行:

Session Support enabled
Registered save handlers    files user
Registered serializer handlers  php_serialize php php_binary wddx

已注册的保存处理程序列出了文件和用户,但没有关于 memcached - 这可能是它不起作用的原因吗?我该如何更改/添加它?

node1_ip 应该是公网 IP 还是私有 IP 还是无所谓?

我可以远程登录到 localhost 11211 但不能登录到 NODE1_IP 11211 - 连接被拒绝。端口 11211 已打开 - 尝试将 /etc/sysconfig/memcached 更改为“-l NODE1_IP:11211”,但仍然拒绝连接

如果我将 /etc/sysconfig/memcached 中的选项更改为空,即 OPTIONS "" 那么我可以 telnet 到 NODE1_IP 11211,所以看起来我放入 memcached 配置的格式是错误的?

我还有什么需要做的吗?我尝试更改保存路径,添加和删除 tcp,使用 127.0.0.1,使用实际 IP 地址,使用以逗号分隔的所有 IP 地址,但仍然无法正常工作。

【问题讨论】:

  • 如何在 NODE1_IP 和 NODE2_IP 上同步 memcached?
  • 已尝试在两个节点以及 /etc/sysconfig/memcached 中的 OPTIONS 中设置 session.save_path = "tcp://NODE1_IP:11211, tcp://NODE2_IP:11211" 但这没有似乎没有任何区别
  • @bhttoan 我做了一个真正的噩梦,让 memcached 在我的负载均衡器后面工作,最终切换到 redis。我玩得很轻松,因为我的应用程序是用 Laravel 构建的。出于兴趣,您是否在使用框架?
  • 尝试将两台服务器指向同一个 memcached 实例以确认处理程序正常工作。向会话中写入一些内容,然后检查 stats items 是否返回密钥。
  • iirc save_path 应该是 host:port。尝试不带 tcp 的 session.save_path = "NODE1_IP:11211"。

标签: php apache memcached


【解决方案1】:

如果你有:

session.save_handler = memcached

这意味着您使用的是 memcacheD 扩展而不是 memcache 扩展。

在这种情况下,配置应该写成没有 tcp:// 协议:

session.save_path NODE1_IP:11211

session.save_path=tcp://NODE1_IP:11211 用于 memcache 扩展,末尾没有“d”。

【讨论】:

    【解决方案2】:

    假设您在负载均衡器上使用粘性会话,并且不能保证来自同一个客户端的请求由同一个 apache 提供服务。

    OPTIONS="-l 127.0.0.1" 告诉 memcached 仅侦听本地环回,即除了 localhost 之外的任何地方都无法访问它。您需要更改它以侦听专用网络接口(确保它不能从 Internet 公开访问)。

    要在两个 apache 服务器上保持会话可用,您需要同步 memcached。最简单的方法是通过将save_path 指向两台服务器来复制所有数据,并将 session_redundancy 设置为 3:

    session.save_path = "tcp://NODE1_IP:11211, tcp://NODE2_IP:11211"
    memcache.allow_failover=1
    memcache.session_redundancy=3
    

    因此会话将保存到两个 memcached 服务器。

    如果您不想为了冗余而牺牲内存,请只保留 1 个 memcached 运行,并将两个 apache 服务器都指向它。

    编辑:

    应该安装 php_memcache 库,例如对于 debian 发行版:

    php 5.x:apt-get install php5-memcache

    php 7.x:apt-get install php-memcache

    【讨论】:

    • 感谢您的回答 - 尝试了所有这些都无济于事。我登录时仍然没有创建会话。在 php.ini 和 /etc/sysconfig/memcached 中,我将 IP 设置为专用网络地址,这是正确的还是 save_path 应该是公共 IP 地址?
    • 另外,在 phpinfo 中,我在 Sessions 下有“Registered save handlers files user” - 是否需要任何其他选项才能使用 memcache?
    • 是的,如果安装了 php_memcache,注册的保存处理程序应该是“files user memcache”
    • php -m 同时显示 memcache 和 memcached - 假设这意味着它已安装?
    • 这是合理的假设。 cli php -i | grep "Registered save handlers" 是否仅显示文件和用户?
    猜你喜欢
    • 2014-02-08
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多