sql >> データベース >  >> RDS >> Mysql

セッション変数:データ量が多すぎますか?

    まず、PHPセッションはデフォルトではメモリに保存されません 、それらはディスクに保存されるため、書き込むすべてのブロック/セッションはメモリではなくディスクスペースを占有します(PHPを使用してセッションデータを読み取るまで)。

    はい、あなたは潜在的により効率的ですが、スケーリングしたい場合はそうではありません。その理由は次のとおりです。


    セッションへのデータの保存

    一部を保存することは完全に許容されます セッションのデータ。理論的には、制限はありません(私はそれを壊そうとしたことも、プッシュしたこともありませんが、より効率的なソリューションに移行するだけです)。ただし、ディスク容量とPHPによって制限されます memory_limit()

    多くの場合、セッションに保存されるデータには次のようなものが含まれます。

    • ユーザー名
    • ハッシュ
    • 登録日
    • その他の変数(ユーザーグループID /キーなど)
    • フラッシュメッセージ
    • (パスワードではありません!)

    ただし、トレードオフがあります。トラフィック(および使用量)が増加し、$_SESSIONに大量のデータを保存している場合 、ディスクとメモリの使用量の両方の点で問題が発生する可能性が非常に高くなります。

    あなたが提案していることに問題はないと思いますが、あなたがリストした項目を超えて、上記の例が重複している場合は、注意が必要です。

    ディスクベースのセッションを(水平方向に)スケーリングして保持する場合は、オプションがあります(スティッキーセッション またはストレージエリアネットワークはカップルです)あるサーバーのディスクは別のサーバーのディスクと同じセッションを保存しないためです。


    セッションデータの場所

    PHPがセッションデータを保存する場所は、次のように呼び出すことで見つけることができます: session_save_path()

    またはCLIで:

    php -r 'echo session_save_path(), "\n";'
    

    OSについては触れていませんが、セッションファイルの一般的な場所(さまざまなOSタイプ間)は次のとおりです。

    /tmp 
    /var/lib/php5/
    /var/lib/php/session
    c:/wamp/tmp
    

    ディスクに保存されているセッションのファイル名は通常、ls -alを使用して次のようになります。 :

    -rw-------  1 www www      0 2013-07-09 20:12 sess_bdsdjedmvtas5njhr5530b8rq6
    

    特定の期間の後にデッドセッションを一掃するガベージコレクションプロセスがしばしばあることに注意する価値があります。 OSによって異なりますが、通常、さまざまなLAMPベースのインストールで存在します。


    その他のセッションストレージオプション/アプローチ

    データベース内
    セッションデータは、ローカルディスクではなくDBに保存されることが多く、これは、適度なレベルのトラフィックを持つマイクロ、スモール、および(実行方法に応じて)中規模サイトの両方で適切に機能します。

    他のソリューションと同様に、長所と短所があります(/tmpからセッションファイルを削除するのではなく、クエリを実行してユーザーを禁止/キックアウトできるようにするなどです。 )

    メモリ内
    大規模な(トラフィックの多い)サイトの場合、特に同時ユーザーの数が多い場合は、DBに過度の負荷をかける代わりに、頻繁にアクセスされる変数やデータのメモリの読み取り/書き込みが高速になります。 DBに書き込むことができ、引き続き書き込む必要があります(ライトスルーキャッシュ> )だけでなく、効率的なアクセスのためにメモリに保持されます。

    特にメリットのある手法の1つは、メモリキャッシュです。 。広く使用されているPHP互換のオープンソースソリューションの例は、Memcached です。 、1台のサーバーまたは多数の[分散]で使用できます。私はこれが中小企業だけでなく大企業でも使用されているのを見てきましたが、誰がそれを使用/貢献しているかを確認するだけで済みます...



    1. SQLiteUNIONオペレーター

    2. 行が存在するかどうかを確認してください、Laravel

    3. テーブル内のすべての列を検索するにはどうすればよいですか?

    4. EF4-選択したストアドプロシージャは列を返しません