PHP Redis在所有服务器上销毁会话

时间:2013-11-14 19:20:25

标签: php session redis

我正在使用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();

但问题是会话只销毁了一台服务器而不是另一台服务器。如何确保在所有服务器上销毁会话?

1 个答案:

答案 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_unsetsession_destroy会话,或者如果需要已启动会话的新会话ID,请致电session_regenerate_id