0

I'm using Nicolasff Redis-PHP extension(https://github.com/nicolasff/phpredis) for handling sessions on multipe servers. So I have changed my session handlers as suggested:

session.save_handler = redis
session.save_path = "tcp://host1:6379?weight=1"

On logout, I am destroying the session like so on one server:

setcookie('session_id', NULL, time() - 4800);
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);
session_destroy();

But the problem is the session is only destroyed one servers and not the other. How can I ensure that session is destroyed on all servers?

4

1 回答 1

0

注意参数“weight”的描述phpredis

主机的权重用于与其他主机进行比较,以便自定义多个主机上的会话分布。如果主机 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 个服务器通过 phpredis 将会话存储在 radis 中,则不需要做任何特别的事情。只需删除会话session_unsetsession_destroy如果您不需要它,或者session_regenerate_id如果需要已启动会话的新会话 id 则调用。

于 2013-11-17T11:03:03.803 回答