(MySQL) データベースから読み取られた特定のユーザーデータがあり、ユーザーの名前や設定など、後続のページ要求で必要になります。
このデータを $_SESSION 変数に格納して、データベース ルックアップを節約することは有益ですか?
私たちは(潜在的に)多くのユーザーについて話しています。$_SESSION に保存すると、同じデータのページ要求ごとにデータベースに何度もアクセスしながら、RAM の使用量 (非常に少量の時間と非常に多くのユーザー) に貢献すると思います。
皮肉なことに、ほとんどのシステムでは、多数のユーザーを獲得したら、セッションをデフォルトのオンディスクストレージから別の永続化レイヤー(つまり、データベース-メモリキャッシュなど)。これは、ある時点で複数のアプリケーションサーバーが必要になるためです。通常、アプリケーションサーバー自体の状態を維持する必要がない方がはるかに簡単です。
多くの大規模システムは、セッションの永続性にメモリ内キャッシュ(memcachedなど)を利用します。これは、複数のフロントエンドサーバーで利用できる共通の永続性レイヤーを提供でき、長時間の永続性(ディスク上のストレージ)を必要としないためです。データ。
適切に設計されたデータベーステーブルやその他のディスクベースのKey-Valueストアも正常に使用できますが、メモリ内ストレージほどパフォーマンスが高くない場合があります。ただし、各セッションキーで保存する予定のデータの量によっては、操作が安価になる場合があります(RAMに大量のデータを保持することは、通常、ディスクに保存するよりもコストがかかります)。
セッションデータのサイズ(平均サイズと最大サイズ)、サポートする予定の同時セッションの数、およびセッションデータにアクセスする必要がある頻度を理解することは、どのソリューションが最適かを判断する上で重要になります。状況。
セッションの使用には1つの大きな欠点があります。データにアクセスするためにすべてのユーザーがセッションを開始しようとすると、ユーザーに同時リクエストを提供できません。これは、PHPがスクリプトによって開始されるとセッションをロックして、データが別のスクリプトによって上書きされるのを防ぐためです。セッションデータを使用するときの通常の考え方は、への呼び出し後session_start()
、データはで利用可能で$_SESSION
あり、スクリプトの終了後にストレージに書き戻されるというものです。これが発生する前に、必要に応じてセッション配列の読み取りと書き込みを行うことができます。PHPは、これがデータをロックすることによってデータを破壊または上書きしないことを保証します。
セッションを必要とするすべてのリクエストはシリアルに実行されるため、サーバーへのAjax呼び出しが多いWeb2.0サイトを実行する場合は、セッションをロックするとパフォーマンスが低下します。セッションの使用を避けることができれば、ユーザーの知覚パフォーマンスにメリットがあります。
問題を回避する可能性のあるいくつかのトリックがあります。
session_write_close()
、この呼び出しの後でセッションに書き込めないことに対処する必要があります。session_start()
、ロックをまったく回避しようとする場合があります。現時点でパフォーマンスの問題がまったくない場合、これらの議論はすべて議論の余地があります。あなたの意図に最も役立つことは何でもしなさい。後で遭遇するパフォーマンスの問題が何であれ、今日はわかりません。それらを回避しようとするのは、時期尚早の最適化(悪の根源です)です。
ただし、常に最適化の最初のルールに従ってください。それを測定し、変更によって改善されたかどうかを確認します。
PHP では、セッション データに複数のストレージ バックエンドを使用できます。デフォルトではファイルに保存されます。1 セッションにつき 1 ファイル。独自のセッション保存ハンドラーを実装することで、データベースをセッション バックエンドとして使用したり、使用したくないものを使用したりすることもできます。
アプリケーションを最もスケーラブルにしたい場合は、ファイル システムでセッションを使用しません。複数の Web サーバーがすべてファームとしてサイトにサービスを提供しているセットアップがあるとします。ファイルシステムでセッションを使用する場合、セッションデータはそのサーバーのファイルシステムでのみ利用できるため、ユーザーは要求ごとに同じサーバーにリダイレクトされる必要がありました。ファイルシステムでセッションを使用していない場合、リクエストに使用されているサーバーは問題になりません。これにより、負荷分散がはるかに簡単になります。
ファイルシステムでセッションを使用する代わりに、私はお勧めします
または (データがセキュリティ上重要な場合)