PHP 7.2 无法读取会话数据:memcache

PHP 7.2 无法读取会话数据:memcache

我正在将一些服务器从 Ubuntu 16 移到 Ubuntu 18,但在使 php 会话和 memcache 正常工作时遇到了问题。

在当前(Ubuntu 16)设置中,有三个服务器使用 memcache 共享会话(注意:不是 memcached!)。

我相信我已经在新服务器上复制了当前设置,但它不起作用,并且我在 apache 错误日志中收到以下错误:

PHP Warning:  session_start(): Failed to read session data: memcache (path: tcp://10.32.82.6:11211?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://10.32.82.7:11211?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://10.32.82.8:11211?persistent=1&weight=1&timeout=1&retry_interval=15)

phpinfo()我看到session.save_pathsession.save_handler设置正确(如上面的日志消息所反映)。

如果我访问这三台机器中的任何一台,我都可以 telnet 到其他任何服务器上的端口 11211。

如果我查看日志(设置为 -vv),我可以看到发生的事情和相当多的“NOT_FOUND”语句,但我真的不知道如何解释这些日志。

/etc/php/7.2/mods-available/memcache.ini

memcache.allow_failover="1"
memcache.max_failover_attempts="4"
memcache.session_redundancy="4"

在当前 (Ubuntu 16) 设置中,我记得尝试过 memcached 和 memcache,并发现 memcache 是正确的解决方案。在新设置上尝试 memcached 是我的最后手段,因为我觉得 memcache应该工作,我只是错过了一些东西,或者 Ubuntu 18 中发生了一些我不知道的变化。

答案1

我在使用 PHP 7.1 和 memcached 时遇到了同样的问题,但我认为这也能解决你的问题。

问题在于读取函数,如果会话不存在,它会返回 false 或 null。您需要重写该函数以返回空字符串。

我如何做到的:

创建一个扩展的类SessionHandler

class MyMemcachedSessionHandler extends SessionHandler {
    public function read($id)
    {
        $data = parent::read($id);
        if(empty($data)) {
            return '';
        } else {
            return $data;
        }
    } 
}

在 session_start() 之前我注册了它

$myMemcachedSessionHandler = new MyMemcachedSessionHandler();
session_set_save_handler($myMemcachedSessionHandler);

我希望这个能帮上忙

答案2

我遇到了同样的问题。我有三台服务器,其中一台升级到 PHP7.2,其他的暂时运行在 7.0 上。我追踪到问题出在两者之间 memcached 库的配置更改。7.0 版本已memcached.sess_prefix设置为memc.sess.key.。7.2 版本已设置为 。我通过在 7.2 机器上memc.sess.运行此命令解决了此问题:session_start()

ini_set('memcached.sess_prefix', 'memc.sess.key.');

相关内容