我正在将一些服务器从 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_path
和session.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.');