2

(MySQL) データベースから読み取られた特定のユーザーデータがあり、ユーザーの名前や設定など、後続のページ要求で必要になります。

このデータを $_SESSION 変数に格納して、データベース ルックアップを節約することは有益ですか?

私たちは(潜在的に)多くのユーザーについて話しています。$_SESSION に保存すると、同じデータのページ要求ごとにデータベースに何度もアクセスしながら、RAM の使用量 (非常に少量の時間と非常に多くのユーザー) に貢献すると思います。

4

3 に答える 3

2

皮肉なことに、ほとんどのシステムでは、多数のユーザーを獲得したら、セッションをデフォルトのオンディスクストレージから別の永続化レイヤー(つまり、データベース-メモリキャッシュなど)。これは、ある時点で複数のアプリケーションサーバーが必要になるためです。通常、アプリケーションサーバー自体の状態を維持する必要がない方がはるかに簡単です。

多くの大規模システムは、セッションの永続性にメモリ内キャッシュ(memcachedなど)を利用します。これは、複数のフロントエンドサーバーで利用できる共通の永続性レイヤーを提供でき、長時間の永続性(ディスク上のストレージ)を必要としないためです。データ。

適切に設計されたデータベーステーブルやその他のディスクベースのKey-Valueストアも正常に使用できますが、メモリ内ストレージほどパフォーマンスが高くない場合があります。ただし、各セッションキーで保存する予定のデータの量によっては、操作が安価になる場合があります(RAMに大量のデータを保持することは、通常、ディスクに保存するよりもコストがかかります)。

セッションデータのサイズ(平均サイズと最大サイズ)、サポートする予定の同時セッションの数、およびセッションデータにアクセスする必要がある頻度を理解することは、どのソリューションが最適かを判断する上で重要になります。状況。

于 2013-01-14T22:40:35.903 に答える
0

セッションの使用には1つの大きな欠点があります。データにアクセスするためにすべてのユーザーがセッションを開始しようとすると、ユーザーに同時リクエストを提供できません。これは、PHPがスクリプトによって開始されるとセッションをロックして、データが別のスクリプトによって上書きされるのを防ぐためです。セッションデータを使用するときの通常の考え方は、への呼び出し後session_start()、データはで利用可能で$_SESSIONあり、スクリプトの終了後にストレージに書き戻されるというものです。これが発生する前に、必要に応じてセッション配列の読み取りと書き込みを行うことができます。PHPは、これがデータをロックすることによってデータを破壊または上書きしないことを保証します。

セッションを必要とするすべてのリクエストはシリアルに実行されるため、サーバーへのAjax呼び出しが多いWeb2.0サイトを実行する場合は、セッションをロックするとパフォーマンスが低下します。セッションの使用を避けることができれば、ユーザーの知覚パフォーマンスにメリットがあります。

問題を回避する可能性のあるいくつかのトリックがあります。

  1. を呼び出すことで、できるだけ早くロックを解除することができますがsession_write_close()、この呼び出しの後でセッションに書き込めないことに対処する必要があります。
  2. 一部のスクリプト呼び出しがセッションからのみ読み取ることがわかっている場合は、を呼び出さずにセッションデータのみを読み取るコードを実装しsession_start()、ロックをまったく回避しようとする場合があります。
  3. I / Oに問題がある場合は、ストレージにMemcacheサーバーを使用するとパフォーマンスが向上する可能性がありますが、ロックの問題には役立ちません。
  4. データベースには、任意のテーブルに格納するすべてのデータでこのロックの問題もあることに注意してください。DBストレージエンジンが適切に選択されていない場合(InnoDBではなくMyISAMのように)、セッションを回避した場合よりもパフォーマンスが低下します。

現時点でパフォーマンスの問題がまったくない場合、これらの議論はすべて議論の余地があります。あなたの意図に最も役立つことは何でもしなさい。後で遭遇するパフォーマンスの問題が何であれ、今日はわかりません。それらを回避しようとするのは、時期尚早の最適化(悪の根源です)です。

ただし、常に最適化の最初のルールに従ってください。それを測定し、変更によって改善されたかどうかを確認します。

于 2013-01-15T00:49:10.207 に答える
0

PHP では、セッション データに複数のストレージ バックエンドを使用できます。デフォルトではファイルに保存されます。1 セッションにつき 1 ファイル。独自のセッション保存ハンドラーを実装することで、データベースをセッション バックエンドとして使用したり、使用したくないものを使用したりすることもできます。

アプリケーションを最もスケーラブルにしたい場合は、ファイル システムでセッションを使用しません。複数の Web サーバーがすべてファームとしてサイトにサービスを提供しているセットアップがあるとします。ファイルシステムでセッションを使用する場合、セッションデータはそのサーバーのファイルシステムでのみ利用できるため、ユーザーは要求ごとに同じサーバーにリダイレクトされる必要がありました。ファイルシステムでセッションを使用していない場合、リクエストに使用されているサーバーは問題になりません。これにより、負荷分散がはるかに簡単になります。

ファイルシステムでセッションを使用する代わりに、私はお勧めします

  • クッキーを使用する
  • 複数のリクエストでリクエスト変数を使用する

または (データがセキュリティ上重要な場合)

  • データベース保存ハンドラでセッションを使用します。したがって、データは、データベース (またはクラスター) から読み取る各 Web サーバーで利用できます。
于 2013-01-14T22:36:12.020 に答える