4

PHP セッション データを redis に移行することを検討しています。

セットアップはシンプルに見えます。php.ini で次のように設定し、apache を再起動するだけです。すべて設定する必要があります。

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

可能であれば、ユーザーが移行に気付かないようにしたいと考えています。既存のセッション データを失うことなく、セッション データを redis に移動することは可能ですか?

4

5 に答える 5

7

現在、求めているものにすぐに使用できるソリューションはありませんが、このタスクのカスタムスクリプトを作成することは、実際にはかなり簡単です。

基本的に、phpredisはセッションデータを次のキー名形式の文字列としてredisに保存します。PHPREDIS_SESSION:$sessionidここ$sessionidで、はセッションのphp IDであり、はを介して取得できsession_id()ます。セッションデータは、php-sessionシリアル化変数として「エンコード」されます(これは、一般的なphpシリアライズ/アンシリアル化とは少し異なる形式です。session_encodeを参照してください

これがわかったので、ファイルに保存されているセッションデータを移行する方法は2つあります。

  • すべてのセッションファイルを繰り返し処理し(実際のパスはsession.save_pathphp.iniで設定されます)、データを読み取り、redisに書き戻します。ファイル自体には、セッションデータのphp-sessionシリアル化表現が格納されます。つまり、コンテンツをそのままredisに直接コピーでき、ファイル名は次のパターンになりますsess_$sessionid。ここで、$ sessionidは、ご想像のとおり、id youあなたのredisキーに使用したいと思うでしょう。

  • 今のところファイルベースのセッションを使用してデータを段階的に移行しますが、redisに保存されているセッションの量が切り替えを行うのに十分な量になるまで、セッションデータが使用されているときにredisにリアルタイムでデータを入力します。これは、次のようなことで実現できます。

    $redis->set("PHPREDIS_SESSION:".session_id(), session_encode());

    各スクリプトが終了する直前。このメソッドは、セッション内のデータの量とsession_encodeの動作によっては、少しオーバーヘッドが追加される場合があります。

于 2012-10-03T15:01:15.163 に答える
3

このようなスクリプトを bash で作成し、リポジトリに追加しました。

https://github.com/renasboy/php-redis-migrate-sessions

于 2013-02-15T10:52:57.350 に答える
2

可能です、はい、簡単ですが、それほどではありません。

私の知る限り、phpredis には移行スクリプトがないため、自分で作成する必要があります。その redis モジュールに対して同様のことを行う Cm_RedisSession のスクリプトを確認することをお勧めします。

于 2012-09-29T12:50:52.047 に答える