Как получить список всех кэшированных элементов по ключу в Laravel 5?
класс кэша в laravel имеет такие методы, как get('itemKey') для извлечения элементов из кэша и запоминания('itemKey', ['myData1', 'myData2']) для сохранения элементов в кэше.
существует также метод проверки наличия элемента в кэше: Cache::has ('myKey');
есть ли способ (при использовании файлового драйвера кэша) получить список всех элементов в кэше?
например, что-то, что может быть названо чем-то вроде " Cache:: all()" что бы вернуть:
[
'itemKey' => [
'myData1',
'myData2'
],
'myKey' => 'foo'
]
единственный способ, которым я могу думать об этом, - это перебрать все возможные имена ключей, используя метод Cache::has (). т. е. aaa, aab, aac, aad... но, конечно, это не решение.
Я не вижу ничего в документации или API, который описывает такую функцию, но я не думаю, что неразумно полагать, что она должна существовать.
3 ответов
нет способа сделать это с помощью кэш фасад. Его интерфейс представляет функциональность, которая все базовые хранилища предлагают, и некоторые из магазинов не позволяют перечислять все ключи.
Если вы используете FileCache, вы можете попытаться достичь этого, взаимодействуя с базовым хранилищем напрямую. Он не предлагает метод, который вам нужен, поэтому вам нужно будет выполнить итерацию по каталогу кэша. Это не будет слишком эффективно из-за много дисковых ввода-вывода, которые могут потребоваться.
чтобы получить доступ к хранилищу, вам нужно сделать
$storage = Cache::getStore(); // will return instance of FileStore
$filesystem = $storage->getFilesystem(); // will return instance of Filesystem
$keys = [];
foreach ($filesystem->allFiles('') as $file1) {
foreach ($filesystem->allFiles($file1) as $file2) {
$keys = array_merge($keys, $filesystem->allFiles($file1 . '/' . $file2));
}
}
^Это выше не работает в LV 5.2
попробуйте это решение:
$storage = \Cache::getStore(); // will return instance of FileStore
$filesystem = $storage->getFilesystem(); // will return instance of Filesystem
$dir = (\Cache::getDirectory());
$keys = [];
foreach ($filesystem->allFiles($dir) as $file1) {
if (is_dir($file1->getPath())) {
foreach ($filesystem->allFiles($file1->getPath()) as $file2) {
$keys = array_merge($keys, [$file2->getRealpath() => unserialize(substr(\File::get($file2->getRealpath()), 10))]);
}
}
else {
}
}
на 'yourKeyGoesHere' вы можете вставить строку, используемую так же, как like С * или вставить непосредственно точно ключ.
$redis = Cache::getRedis();
$a_keys = $redis->keys("*yourKeyGoesHere*");
foreach ($a_keys as $key){
//Your Action ...
//For example forget key
$redis->del($key);
}