如何在Laravel 5中按键获取所有缓存项目的列表?

2022-08-30 20:45:05

laravel 中的 Cache 类具有 get('itemKey') 等方法,用于从缓存中检索项目,并记住('itemKey', ['myData1', 'myData2']) 用于将项目保存在缓存中。

还有一种方法来检查缓存中是否存在项目:Cache::has('myKey');

有没有办法(使用基于文件的缓存驱动程序时)获取缓存中所有项目的列表?

例如,可能被命名为“Cache::all()”的东西将返回:

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

我能想到的唯一方法是使用 Cache::has() 方法遍历所有可能的键名。即 aaa、aab、aac、aad...但当然,这不是一个解决方案。

我在文档或API中看不到任何描述此类函数的内容,但我认为相信必须存在函数并不是不合理的。


答案 1

较旧的答案在Laravel 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 {

        }
    }

答案 2

使用缓存外观无法执行此操作。其接口表示所有底层存储提供的功能,某些存储不允许列出所有密钥。

如果您使用的是 FileCache,则可以尝试通过直接与底层存储交互来实现此目的。它不提供所需的方法,因此您需要循环访问缓存目录。由于可能需要发生大量磁盘I / O,因此它不会太有效。

为了访问存储,您需要做

$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));
  }
}

推荐