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

Ben*_*ess 2 php memcache session

我正在将一些服务器从 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)
Run Code Online (Sandbox Code Playgroud)

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

如果我去三台机器中的任何一台,我都可以远程登录到任何其他服务器上的端口 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"
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

问题在于 read 函数,如果会话不存在,则返回 false 或 null。您需要覆盖该函数以返回空字符串。

我是如何做到的:

创建了一个扩展的类 SessionHandler

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

在 session_start() 之前我注册了它

$myMemcachedSessionHandler = new MyMemcachedSessionHandler();
session_set_save_handler($myMemcachedSessionHandler);
Run Code Online (Sandbox Code Playgroud)

我希望这个能帮上忙