Как получить список всех кешированных элементов по ключу в Laravel 5?

Класс Cache в laravel имеет такие методы, как get ('itemKey') для извлечения элементов из кеша и запоминание ('itemKey', ['myData1', 'myData2']) для сохранения элементов в кеше.

Существует также метод проверки наличия элемента в кеше: Cache :: has ('myKey');

Есть ли способ (при использовании файлового драйвера кеша), чтобы получить список всех элементов в кеше?

Например, что-то, что можно назвать чем-то вроде «Cache :: all ()», которое вернет:

[ 'itemKey' => [ 'myData1', 'myData2' ], 'myKey' => 'foo' ] 

Единственный способ, которым я могу это сделать, – это перебрать все возможные имена ключей, используя метод Cache :: has (). т.е. aaa, aab, aac, aad … но, конечно, это не решение.

Я не вижу ничего в документации или API, который описывает такую ​​функцию, но я не думаю, что ее необоснованно полагать, что она должна существовать.

Нет способа сделать это, используя фасад кеша . Его интерфейс представляет собой функциональность, предлагаемую всеми базовыми хранилищами, а некоторые из магазинов не позволяют перечислять все ключи.

Если вы используете 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 { } }