我正在使用Nicolasff Redis-PHP扩展(https://github.com/nicolasff/phpredis)来处理多服务器上的会话。所以我按照建议更改了会话处理程序:
session.save_handler = redis
session.save_path = "tcp://host1:6379?weight=1"
注销时,我在一台服务器上销毁这样的会话:
setcookie('session_id', NULL, time() - 4800);
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);
session_destroy();
但问题是会话只销毁了一台服务器而不是另一台服务器。如何确保在所有服务器上销毁会话?
答案 0 :(得分:0)
请注意phpredis
中参数“weight”的说明:
主机的权重与其他主机的权重相比较,以便在多个主机上自定义会话分布。如果主机A的重量是主机B的两倍,它将获得两倍的会话数量。在该示例中,host1存储所有会话的20%(1 /(1 + 2 + 2)),而host2和host3每个存储40%(2/1 + 2 + 2)。目标主机在会话开始时一劳永逸地确定,并且不会更改。默认权重为1.
它表示phpredis按会话ID选择目标服务器,并在每次更改时选择它。在您的代码中:
//Both of next lines delete session key in redis stotage.
//Read from 411 line of redis_session.c
session_unset();
session_destroy();
//delete current session (due to $delete_old_session = true) and start new
//session i.e. select new server and write data.
session_regenerate_id(true);
换句话说 - 如果您使用N服务器在radis中使用phpredis存储会话,则不需要做任何特殊操作。如果您不需要,请简单地删除session_unset
或session_destroy
会话,或者如果需要已启动会话的新会话ID,请致电session_regenerate_id
。