私の Web サイトには、クライアントごとに非常に細かい権限システムがあり、サイズがかなり大きくなっています。
データベース クエリを制限するために、ユーザー セッションの開始時に mysql データベースからビットマスクをロードし、それをセッション データとして保存したので、次のようになりました。これにより、巨大なセッション ファイルを作成することなく、ユーザー セッションごとに 1 つの (複雑な JOIN クエリではありますが) クエリを作成することができました。
"permissions" => array(
"type 1" => 'bitfield'
"type 2" => 'bitfield'
"type 3" => array(
entity id = 'bitfield'
entity id = 'bitfield')
"type 4" => array(
entity id = 'bitfield'
entity id = 'bitfield')
)
パーミッションは完全にグループ ベースであるため、特定のグループ内のすべての人は、これをセッション データにレプリケートします。
ただし、ビットマスクを使用するのが面倒になり始めており、ACL の使用に移行しようとしています。そもそも ACL を使用しなかった理由は、データベースの使用を最小限に抑えるためでした..
だから..今、私はビットマスクなしで完全にデータベース/キャッシュ駆動型のACLを持つつもりです. ただし、ユーザー セッション データにアクセス許可の膨大な配列を格納することは、理想的ではないようです。(同意しますか?)
進むべき道は、フラット ファイル キャッシュを使用してグループのアクセス許可を保存することだと思います。これを行う最も簡単な方法は、グループごとのファイルでしょうか? これは、それぞれ 4 つの権限タイプを持つ 4,000 以上のグループがある場合に変わりますか (2 つの権限タイプは、組み合わせて 40 程度の権限を持つグローバルであり、2 つのタイプは、エンティティごとに組み合わせた 40 程度の権限を持つローカル権限です (各タイプには、おそらく 3 つか 4 つの多くの権限があります)。 20 パーミッション!).編集: 明確にするために、これはグループごとに 160 - 200 パーミッション エントリを意味します
これは、かなり巨大なキャッシュになるようです。ページの読み込みごとに大量のデータベースを使用するのが最善でしょうか? この種のデータサイズにより、ビットマスクははるかに簡単になりましたが、もはや十分な柔軟性がありません.
これは、ファイルが 2 つの異なるサーバーによって提供されるという事実によって難しくなります (セッションは固定されているため、ビットフィールドをセッション データに保存することは問題ではありませんでした)。サーバー間でキャッシュを同期する必要があります。データベースは、おそらく1ギグ接続のプライベートネットワークで接続された別のサーバー上にあります。
解決策を提案できますか? この大量のデータを含む memcached などのクイック アクセス キャッシュは、メモリ使用量を水から吹き飛ばすだけだと思いますか? 多くのデータベース クエリを使用するだけの誘惑に駆られますが、db サーバーに負担がかかりすぎる可能性があると思います。
かなり大きな質問ですが、明確になることを願っています。説明が必要な場合はお知らせください。どんな解決策も大歓迎です!
クリス