2012-04-09 7 views
16

私はPHPでセッションを使用して、ユーザーがログインしているかどうかを追跡しています。私は、ユーザーに関するその他のデータを格納するために使用しません。基本的には、ユーザーが認証済みかどうかを確認するためにハッシュテーブルをチェックするようなものです。redisとネイティブセッション

ネイティブPHPセッションの代わりにredisを使用するといくつかの利点がありますか?

私はパフォーマンス、スケーラビリティ、セキュリティ(コードの複雑さには関係ありません)に興味があります。

+1

大量のトラフィックが発生したり、PHPがセッションをうまく処理したりしない限り、セッションに関する多くのことを心配する必要はないと思います。パフォーマンスについては、それは近いものでなければなりません。なぜなら、redisはPHP固有のものではないからです。 – gosukiwi

+0

@こんにちは、ありがとう!大規模なことはどういう意味ですか?一度に10kユーザーのように、または1milのように?私はそれが私のマシンに依存していることを理解していますが、PHPがいくつかの上限があるかどうかを調べようとしています(それぞれのセッションを個別のファイルとして保存し、OSのファイルシステムのパフォーマンスに合わせる場合など)。 – tau

+1

さて、この場合のサーバーのメモリ使用量については、すべてのユーザーが10kユーザーのRAMに格納されているため、各ユーザーがセッションの1kbデータを使用した場合、10,000kbまたは10〜mbを消費しますセッションデータが大きすぎる場合、または何らかの理由でサーバがセッションデータを読み取るのに多すぎるリソースを消費している場合に問題が発生しますが、PHPは十分なデータ構造を使用してその値を保持し、それは通常、データが大きすぎる場合です。 – gosukiwi

答えて

-35

ではなく、ネイティブのPHPセッションのRedisのを使用して、いくつかの利点があるだろうか?

パフォーマンス - PHPセッションが優れています。 Redisよりも高速です。なぜなら、ネットワーク経由ではなく、RAMからの読み取りだからです。

スケーラビリティ - Redisセッションが優れています。 PHPセッションは1台のマシンでのみ動作します。要求を処理するために複数のマシンが必要な場合は、スティッキセッションを実装する必要があります。 Redisでは、複数のマシンがセッション状態を共有できます。ユーザーの要求は問題なく任意のサーバーに移動できます。

耐久性 - ウェブサーバーが何らかの理由でクラッシュした場合、すべてのセッション状態が失われます。 Redisでは、さまざまな永続性オプションを使用できます。特定のRedisサーバがダウンしてもセッション情報を失わないようにすることができます

セキュリティ - 両方の方法を使用して優れたセキュリティを実現することができます。すべてのことが同じであれば、私はPHPセッションはもう少し安全だと言いますが、心配することは1つ少ないからです。

+44

PHPセッションはRAMには格納されず、ディスク上のファイルとして保存されます。誰がWebサーバーの再起動時に失われたとおっしゃいましたか? – ThiefMaster

+0

@ThiefMaster - PHPセッションがディスクに保存されていることを認識しませんでした。それは、耐久性に関する私の指摘が立っている。サーバーがクラッシュした場合(再起動ではなく)、セッションデータが失われます。 RedisまたはMySQLバックアップセッションでは、耐久性が向上します。 –

+9

それでもあなたはそれらを必ず失うわけではありません。 OSがクラッシュし、セッションファイルが破損していないか、実際にハードディスクにまだ書き込まれていない場合を除きます。 – ThiefMaster

0

あなたは大量のトラフィックを得ることができない限り、セッションについて心配する必要はないと思います。PHPはセッションをうまく処理します。ちょっとしたデータしか保存しないと、たくさんのリクエストがあってもうまくいくはずです。 redisはPHPに固有のものではないため、パフォーマンスに関しては近いはずです。

10kユーザーの場合、各ユーザーがセッションの1kbデータを使用すると、10,000kbまたは10〜mbを消費します。 PHPは、十分なデータ構造を使用して、それらの値を保持し、それらの値をすばやく書き込みおよび読み込むのに十分なほどスマートです。問題は、セッションデータが大きすぎる場合、または何らかの理由でサーバーがセッションデータを読み取るのに多すぎるリソースを消費する場合ですが、通常はデータが大きすぎる場合です。

11

あなたは、保存ハンドラセッションが速くなりたいです。これは、PHPセッションが、最初のリクエストが完了するまで、同じユーザーからの他のすべての同時リクエストをブロックするためです。

NFS、MySQLデータベース、Memcache、Redisのファイルを複数のサーバーに渡ってPHPセッションに使用できるさまざまなハンドラがあります。

データベースメソッド(InnoDBを使用しています)は、私の経験の中で最も遅く、続いてFile w/NFSでした。ロックと書き込みの競合が主な要因です。 MemcacheとRedisは同様のパフォーマンスを提供し、すべての操作がRAMにあるため、はるかに優れた選択肢です。ディスク永続性を有効にすることができ、Memcacheはメモリのみに基づいているため、Redisは私の選択です。

詳細については、Redis Sessions in PHP with Kohanaを説明します。セッションを保存するためのRedisのようなものを使用して

Redis Dashboard

12

は、負荷分散サーバのうちより高いパフォーマンスを得るための素晴らしい方法である:ここではRedisの鍵を管理するための私たちのダッシュボードがあります。

たとえば、Amazon Web Servicesでは、ロードバランサには「スティッキーセッション」というものがあります。つまり、ユーザーが最初にあなたのウェブアプリに接続すると、それにログインすると、ロードバランサはアプリケーションサーバーの1つを選択し、このユーザーはアプリケーションを終了するまでこのサーバーから引き続きサービスを受けます。これは、たとえばPHPで使用されるセッションが、最初に使用するアプリケーションサーバーに格納されるためです。

別のサーバーでRedisを使用し、各アプリケーションサーバーでPHPを設定してセッションをRedisに保存すると、この '固定セッション'をオフにすることができます。これは、あなたのサーバーのいずれかがセッションにアクセスできることを意味します。そのため、ユーザーはアプリケーションへのリクエストごとに別のサーバーからサービスを受けることになります。これにより、ロードバランシングの設定をより効率的に使用することができます。