0

複数のサーバーでセッションを処理するために、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 つのサーバーのみを破壊し、他のサーバーを破壊しないことです。すべてのサーバーでセッションが確実に破棄されるようにするにはどうすればよいですか?

4

1 に答える 1

0

のパラメータ「重み」の説明に注意してくださいphpredis

ホストの重みは、複数のホストでセッションの分散をカスタマイズするために、他のホストと比較して使用されます。ホスト A がホスト B の 2 倍のウェイトを持っている場合、セッションの量は 2 倍になります。この例では、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_unsetか、不要な場合はセッションを削除するか、すでに開始されているセッションの新しいセッション ID が必要な場合はsession_destroy呼び出します。session_regenerate_id

于 2013-11-17T11:03:03.803 に答える