2009-05-20 6 views
2

私は自分のサイトのための簡単なフォーラムに取り組んできました。あなたの最後の訪問以来未読の投稿+フォーラムをマークする機能を追加しています。これは私が欲しいことをする良い方法です(PHPで)?

私は本質的に、フォーラムへの最後のアクセス日を各ユーザーアカウントで保存しています。ユーザーがサイトに戻ったときには、post_idとpost_parent_forumの値をすべて取得するためにクエリが実行され、配列に追加されます。その値は、SESSION変数に格納され、キーはpost_id(一意です)フォーラムのIDです(ポストはいくつかのフォーラムに表示されるので一意ではありません)。

フォーラムのインデックスでは、各フォーラムでin_array()を使用して、forum_idが配列内にあるかどうかを確認します。そうであれば、「未読」とマークされます。

スレッドリストでは、array_key_exists()を使用して、各スレッドIDのキーが配列内にあるかどうかを確認します(存在しない場合)。

投稿を表示すると、アイテムはスレッドのIDと等しいキーで配列から削除されます。

この方法は合理的ですか、フォーラムが普及したら問題にぶつかりますか?私は各フォーラムのリストで20個のarray_key_exists()チェックを実行することを心配していました。合理的に速いですか?

私はSESSIONストアドアレイで直接作業することはできますか?通常の変数にその値を割り当て、キーを削除し、古いセッション変数を設定解除してから再設定する必要がありますか更新された配列で?

+0

ユーザーがログオンしてからログオフしてからログオンした場合、これは機能しますか?すべての投稿が「読んだ」とマークされるのではないでしょうか? – peirix

+0

いいえ、最後のアクセスのタイム・スタンプは引き続きアカウントに保存されるためです。したがって、最後のアクセス以降に追加されたアイテムのみ(この例では1分前)です。 –

+0

「あなたの最後の訪問以来」とは、最後のページリフレッシュではなく、最後に成功したログイン(現在のものより前のログイン)以降を意味します。 – stefs

答えて

1

php配列はハッシュテーブルです!ハッシュ・キー・ルックアップはそれほど高価ではないので、いいえ、私はあなたがこれのためにパフォーマンスの問題に遭遇するとは思わない。

in_arrayは別の問題です(配列全体を検索します)が、実際には問題はありません。早すぎる最適化に注意してください!

私はSESSION格納された配列

はいを​​直接操作することができます。 $_SESSIONは、(通常)セッションファイルの内容のシリアル化を解除してsession_start()を呼び出すと入力される配列です。スクリプトが終了するかsession_write_close()が呼び出されると、$ _SESSION配列はserialize()になります。本当に魔法はありません。

あなたははそれを行う必要がある場合は、すべての$_SESSIONグローバル変数(ewwww)した後、別の質問です。あなたが行くことができます

+0

私はもっと速く(やや怠惰な)そのように思った。代わりに、読んだり、修正したり、解除したり、リセットしたりした。物事があまりにも複雑にならない場合、それは何も間違っていません。 –

+1

しかし、私は勇敢な男を狂ってしまうセッションモンスターを見ました。私がきれいにしたいのであれば、私は通常、ゲートキーパーとして働くクラスを書く。 – stefs

0

ちょうど別のルート...

はuserテーブルのlast_activityのタイムスタンプフィールドを持っており、ユーザーが新しいページをロードするたびにそれを更新します。

各投稿/フォーラムのlast_updatedタイムスタンプフィールドがあります。

フォーラム/投稿が「未読」であるかどうかを確認するには、タイムスタンプを比較するだけです。

+0

投稿の閲覧に関係なく、アクティビティタイムスタンプが更新されます。 –

+0

あなたは何を言っているのか分かりません。アクティブなユーザーは、ページが読み込まれるたびに更新されます。ポスト/フォーラムはすべてのコメント/スレッド/何でも更新されます。 最後にページを読み込んだときと、オブジェクトが最後に更新されたときがわかっています。あなたはその情報の権利で未読のオブジェクトを得ることができるはずですか? – Galen

+0

投稿のタイムスタンプがビュー上でも更新された場合、他の誰かが読んだとしても、あなたが読んだ投稿を登録します。そうでない場合は、ユーザーが最初のページを読み込んだ後、すべての投稿が「読み込み」されます。 –

0

私のプラクティスでは、ハッシュテーブルのパフォーマンスについて心配する必要はありませんが、DB関連の問題を考えると、リソース(特にフォーラムのようなテキストでいっぱいです)の中で最もコストが高いからです。私はPHPのパフォーマンスに関連する問題には一度も触れていませんMySQLの問題はずっと速くなってきました。

関連する問題