2009-07-19 7 views
2

、私は次のシナリオがあります。すべてのセッションから一部のセッションデータを消去する方法はありますか?一般的には

  • がデータベース
  • から製品とその関連データを取得するセッションで
  • キャッシュ製品のオブジェクトの製品 'オブジェクトのphpへ
をフェッチされたデータを変換します

キャッシュは読み取り専用です。つまり、サイトの商品を表示している顧客です。

しかし、getProductIdsByCategory($categoryId)のような呼び出しがあり、これらの結果のproductIdsもユーザーごとにキャッシュされ、私が読んだグローバルキャッシュは使用されません。

admin側の誰かが新しい製品を追加してそれをカテゴリに関連付けると、新しいセッションが開始されるまで、顧客は新しい製品IDをキャッシュされたgetProductIdsByCategoryに表示しません。

新しい製品を追加したときにサーバー上のALLセッションからたとえば$_SESSION['x']を削除する方法はありますか?顧客がログインなどを失うため、すべてのセッションを破棄したくありません。

キャッシュされたproductId検索をグローバルキャッシュに移動する必要がありますか?

p.samはmemcachedなどのカスタムキャッシュを使用していません。

おかげ

答えて

5

デフォルトでは、セッションデータはファイルシステム内のどこかでシリアライズされたファイルに過ぎず、問題の情報を削除するためにすべてを変更することができます(ロックを尊重して現在開かれているセッション)。

私は本当にそれをお勧めしません。私がお勧めするのは、session_start()が起きたときに見られるデータベースに保存されたタイムスタンプのように、このキャッシュされたデータをリフレッシュするように通知する方法です。キャッシュされたデータがタイムスタンプより古い場合、キャッシュはフラッシュされます。

+0

これは本当に良いアイデアのようです。 30分後などにそのフラグを削除しなければならないと思いますが? –

+0

理由がわかりません。それは過去に進んでいくばかりでなく、キャッシュされたデータを最近入手したセッションはそれに煩わされることはありません。 – chaos

+0

あなたはそうです、私はこれを試してみるつもりです。ありがとう –

3

あなたはmemcacheのようなキャッシュシステムを通じて本当の共有状態で何ができるようになりね。

心に印刷します唯一の他の方法は、ダーティキャッシュデータのフラグのためのアプリケーションのチェックを持っており、それ自体を削除するか、またはあなたのキャッシュが解析可能なシリアル化された形でデータベース内にある場合は、それらを読むために高価スクリプトを記述していますすべて、しかしそれは既にデータを読んだ要求で厄介な遅れを作ります。

私はオブジェクトのコピーをチェックするよりも実際の共有状態になります。セッション値の使用をクリアする

+0

memcachedは良い「現代的な」方法を使っていますか?私はそれについて多くを知らない。 –

+1

@David、はい。同時にアクセス可能な共有状態があれば動作します。一部のORMシステムではこれが可能です。 PHPが共有状態をアプリケーションにコピーするので、システムとのクリアにギャップがあることを覚えておいてください。キャッシュが汚れている場合や、必要に応じて同様の制約がある場合は、再保存をやめる必要があります。それはあなたが制限する必要がある輸入です。 –

-2

unset($_SESSION['x']); 

あなたは、データベース内のセッションを保存しない限りは、その

+0

これは、現在のユーザーのセッションのみをクリアします。管理者ユーザーが新製品を追加する場合は、すべてのユーザーから$ _SESSION ['x']をすべてクリアする必要があります –

1

のセッションでは、ループ、データの任意の特定のビットをクリアすることは難しいだろうことがあります。

ユーザーセッションではなくファイルにキャッシュすることをお勧めします。このようにしても同じメリットが得られますが、キャッシュされる内容とクリアされる時期を完全に制御できます。

0

はい、グローバルキャッシュに移動する必要があります。セッションは世界的にアクセスされるものではなく、可能性はほとんどないと思います。

1

特定のアプリケーションの既存のセッションをすべて無効にするには、PHPのsession_name('new_session_name')を使用してアプリケーションのセッション名を変更するだけです。この関数は、session_start()を呼び出す前に呼び出す必要があります。

これは実際にはをクリアします。現在のセッションはですが、このアプリケーションでは役に立たなくなります。

関連する問題