これらの変数がapc、memcached、eacceleratorに保存されていると仮定しましょう。
article_1_0
article_1_1
article_3_2
article_3_3
article_2_4
article_3_
(最大10000に達する可能性がある)で始まるすべてのキャッシュ変数を削除するにはどうすればよいですか?
キャッシュされた変数を一覧表示する方法はありますか?
これらの変数がapc、memcached、eacceleratorに保存されていると仮定しましょう。
article_1_0
article_1_1
article_3_2
article_3_3
article_2_4
article_3_
(最大10000に達する可能性がある)で始まるすべてのキャッシュ変数を削除するにはどうすればよいですか?
キャッシュされた変数を一覧表示する方法はありますか?
APCの場合:
$iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
foreach($iterator as $entry_name) {
apc_delete($entry_name);
}
加速器の場合:
foreach(eaccelerator_list_keys() as $name => $infos) {
if (preg_match('#^article_3_#', $name)) {
eaccelerator_rm($name);
}
}
memcachedについては、@rikの回答をご覧ください
複数のキーを一度に期限切れにするための一般的な解決策は、それらに名前空間を付けることです。それらを期限切れにするには、名前空間を変更する必要があります。
キーのグループ「article_3_1」、「article_3_2」、...があるとします。これらは次のように保存できます。
$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);
このようにそれらをフェッチします:
$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");
そして、名前空間をインクリメントするだけで、それらすべてを期限切れにします。
apc_inc('article_3_namespace');
ドキュメントには、APCIteratorはapc> = 3.1.1で利用可能であると記載されていますが、私はapc 3.1.9を使用していると主張するいくつかのシステムを使用していますが、APCIteratorは存在しません。APCIteratorを自由に使用できない場合は、次のようなものを回転させてください。
$aCacheInfo = apc_cache_info('user');
foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
apc_delete($_aCacheInfo['info']);
この例では、キーのプレフィックスをチェックしていますが、preg_matchetを使用できます。そして、APCIteratorが提供するものに近い何かを達成します。
memcacheからすべてのキーを取得する方法はありますが、非常にコストがかかります。
memcachedの代替を使用する可能性がある場合、scacheは構造化キースペースをサポートします。これを使用すると、ネストされたパスにデータを保存できます。
scache_shset($conn, 'article/1/0', $data10);
scache_shset($conn, 'article/3/0', $data30);
scache_shset($conn, 'article/3/1', $data31);
最終的に親ノードを削除してデータを破棄します
scache_shunset($conn, 'article/3');
APCのキーを検索するのに役立つAPCIteratorがあります。APCIteratorをインスタンス化します。
APCIterator :: valid()は、トラフを反復処理するためのキーがまだあることを意味します。APCIterator :: key()はapcキーを返します。APCIterator :: next()は、イテレータの位置を次の項目に移動します。
// APC
$iterator = new APCIterator('user', '/^article_3_/');
while($iterator->valid()) {
apc_delete($iterator->key());
// You can view the info for this APC cache value and so on by using
// $iterator->current() which is array
$iterator->next();
}
memcacheの場合、Memcachedを使用してgetAllKeysメソッドを使用できます
// Memcached
$m = new Memcached();
$m->addServer('mem1.domain.com', 11211);
$items = $m->getAllKeys();
foreach($items as $item) {
if(preg_match('#^article_3_#', $item)) {
$m->delete($item);
}
}