2011-06-28 11 views
5

ウェブサイトを構築するときに、ユーザーがログインしているときにセッション情報をどのように保存するかを決める必要があります。ファイルとデータベースにセッションデータを保存する際の長所と短所は何ですか?

各セッションを独自のファイルに保存してデータベースに保存する賛否両論は何ですか?

+1

明らかに、PHPのような言語はセッションを/ tmpの中にデフォルトでファイルに保存します。ただし、これらのファイルはランタイムによって管理されているため、ファイルにアクセスする方法でセッションにアクセスする必要はありません。 RoRはデフォルトでクッキーを使用しますが、これもファイルベースですが、そのようには扱われません。 –

答えて

2

私は一般に、この情報をファイルに保存しませんでした。このファイルをメモリ内外にスワップする可能性があります(はい、キャッシュされる可能性があります)。しかし、あなたはかなり非標準的なものを使用しています。 は

  1. ASP.Net

    では、シングルサーバー上の使用に適していますメモリコレクションにで使用することができます。ロードバランシングされた複数のWebサーバー(Webファーム)が必要な場合、ユーザーは各要求ごとに別のサーバーにアクセスできますが、このオプションは良くありません。 Webプロセスが再開すると、セッションは失われます。タイムアウトすることもできます。

  2. asp.netの状態サーバーを複数のサーバーアクセスに使用できます。これは、Webサーバーのプロセス外で実行されます。 Webプロセスが再開すると、あなたはOKで、複数のサーバーがこれにアクセスします。このトラフィックは状態サーバーに送信されるため、暗号化されないため、より安全な環境でトラフィックを保護するためにIPSECポリシーを理想的に使用します。

  3. セッションデータベースとしてsql serverを使用するようにweb.configを設定すると、sql serverを使用して状態を(自動的に)管理できます。これにより、高性能のデータベースと複数サーバーへのアクセスの利点が得られます。

  4. あなたは、通常のメカニズムの外に長い時間を持続するためにそれらを必要とデータベースフィールド(多分あなたは、特定のフィールドを照会する)

上の厳密な制御をしたい場合は、データベースで独自のセッションを使用することができます

また、好奇心から外れています - 多分あなたはセッションをユーザーの好みと呼んでいますか?その場合、asp.netのプロファイルを調べる

+0

また、ここでは詳細について心配する必要があります - それぞれのシステムには独自の方法が組み込まれています - これは、あなたが高性能に非常に関心があるサイトでなければ、 –

1

ファイルにセッションを保存するのが容易ではありませんが、私はr-o-rについてはわかりません。しかし、(同じプロセスの)メモリにセッションを格納する方が、dbに格納するよりも高速です。 DBに入れることで、アプリケーションのスケーラビリティが向上する可能性があります(Webファーム環境でアプリケーションを展開する場合は、すべてのサーバーに共通の(db)セッションがあります)。

Thisコードプロジェクトの記事は、asp.netセッション管理についての非常に良い洞察力を与えます。

1

これまでの質問に基づいて、CGI :: Application :: Plugin :: perlのCGI :: Applicationモジュールを使ってperlのCGI :: Applicationモジュールを使うというコンテキストで尋ねられますセッション。デフォルトの設定でそのモジュールを使用すると、/ tmpディレクトリに格納されているファイルにセッションデータが書き込まれます。これはPHPの動作と非常によく似ています。あなたのアプリケーションが共有ホスティング環境で実行されている場合、セキュリティ上の理由から、他のユーザーが/ tmp内のデータを表示/変更する可能性があるため、これをしたくないかもしれません。これを修正するには、読み書きする権限がある(つまり、/ tmpでない)ディレクトリにファイルを書き込んでください。開発時には、私は人間が読めるので、デフォルト(格納可能)ではなく、直列化にYAMLを使用する方がはるかに好きです。独自のWebサーバーがあり、同じマシン上でデータベース(mysql)サーバーを実行できる場合は、ファイルではなくデータベースにセッションデータを格納すると、通常はパフォーマンスが向上します。 (mod_perlまたはfastcgiを使用して)永続的なデータベース接続を維持します。しかし、データベースがリモートホスト上にあり、セッションデータを更新する必要があるたびに新しい接続を開く必要がある場合は、実際にパフォーマンスが悪化する可能性があり、ファイルへの書き込みが優れている可能性があります。アプリケーションへのデータベースのように見えるsqliteを使用することもできますが、実際にはローカルファイルシステム上のファイルにすぎません。パフォーマンスにかかわらず、データベースオプションは、帯域幅の制限やその他のリソース制限のため、共有ホスト環境では望ましくない可能性があります。パフォーマンスの差は、トラフィックの少ないサイト(つまり、1日に数千回のヒット)ではごくわずかです。

+0

はい、それはまさに正しい=)私はここに設定して、これをどのように保存すべきかと思っています。私もYAMLの大ファンです。この文脈で「シリアライゼーション」とは何を意味しますか?私はあなたがデータベースの代わりにYAMLを使うとは思わない?ファイルベースとデータベースベースの非常に有用な事実! –

+1

セッションデータは、perlデータ構造体(通常は単純なハッシュ)に格納されます。そのデータ構造を、ファイルまたはデータベースのいずれかで読み書きできるものに変換する必要があります。これが逐次化の意味です。 YAMLを使用する場合は、データをシンプルなテキスト文字列にシリアル化します。 「保存可能な」モジュールは、よりコンパクトなバイナリ形式でデータを格納します。非常に速く、非常に効率的ですが、移植性はあまりありません。私は以前のバージョンでは、バージョンをアップグレードした後、古いバージョンで書かれたデータを新しいバージョンでは読み取れなかったということを発見しました。 – scorpio17

+1

私は実稼働のためにmysqlで保存可能なシリアライザを使用します。しかし、新しいものを開発するときは、ファイルベースのセッションに切り替えてYAMLでシリアライズするので、どのセッションデータが格納されているのかを簡単に見ることができます。デバッグが容易になります。 CGI :: Applicationを使うと簡単に前後に切り替えることができます。すべてのアプリケーションクラスが派生する基底クラスの中のcgiapp_initメソッドのすべてを制御します。 – scorpio17

関連する問題