Класс 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 { } }