2

一般に、次のシナリオがあります。

  • 製品とその関連データをデータベースから取得
  • 取得したデータをphpの「製品」オブジェクトに変換する
  • 製品オブジェクトをセッションにキャッシュする

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

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

問題は、管理者側の誰かが新しい製品を追加してカテゴリに関連付けた場合getProductIdsByCategory、新しいセッションが開始されるまで、顧客のキャッシュに新しい productId が表示されないことです。

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

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

psは、memcachedなどではなく、カスタムビルドのキャッシュを使用しています。

ありがとう

4

7 に答える 7

5

デフォルトでは、セッション データはファイル システムのどこかにあるシリアル化されたファイルであり、それらすべてを変更して問題の情報を削除することができます (ロックを考慮して、現在開いているセッションを踏まないようにします)。

ただし、あまりお勧めしません。私がお勧めするのは、このキャッシュされたデータを更新する必要があることを通知する方法を作成することです。たとえば、データベースに保存されたタイムスタンプがsession_start()発生したときに確認され、キャッシュされたデータがタイムスタンプより古い場合は、キャッシュがフラッシュされます。

于 2009-07-19T12:50:26.207 に答える
3

memcache のようなキャッシュ システムを介して実際の共有状態を処理できるように思えます。

頭に浮かぶ他の唯一の方法は、アプリケーションにダーティキャッシュデータのフラグをチェックさせてそれ自体を削除させることです。または、キャッシュが解析可能なシリアル化された形式のデータベースにある場合は、それらすべてを読み取るための高価なスクリプトを記述しますが、それはすでにデータを読み取ったリクエストとの厄介な遅れ。

オブジェクトのコピーをチェックするよりも、実際の共有状態を使用します。

于 2009-07-19T12:47:54.973 に答える
1

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

これにより、現在のセッションが実際にクリアされることはありませんが、このアプリケーションでは使用できなくなります。

于 2009-10-12T21:46:37.537 に答える
1

セッションをデータベースに保存しない限り、特定のデータを消去するのは難しいでしょう。

ユーザーセッションではなく、ファイルにキャッシュすることをお勧めします。この方法でも同じ利点が得られますが、何がキャッシュされ、いつクリアされるかを完全に制御できます。

于 2009-07-19T12:49:38.297 に答える
0

はい、グローバル キャッシュに移動する必要があります。セッションはグローバルにアクセスするためのものではありません。私はそれが可能だとはほとんど思いません。

于 2009-07-19T12:51:04.240 に答える
-2

セッション値をクリアするには:

unset($_SESSION['x']); 

そのためにセッションをループすることができます

于 2009-07-19T12:49:09.950 に答える