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_path和session.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)
我希望这个能帮上忙
| 归档时间: |
|
| 查看次数: |
8959 次 |
| 最近记录: |