2015-08-03 14 views
6

Lớp Cache trong Laravel có các phương thức như get ('itemKey') để lấy các mục từ bộ nhớ đệm, và nhớ ('itemKey', ['myData1', 'myData2']) để lưu các mục trong bộ đệm.Làm cách nào để lấy danh sách tất cả các mục được lưu trong bộ nhớ cache bằng khóa trong Laravel 5?

Ngoài ra còn có một phương pháp để kiểm tra xem một mục có tồn tại trong bộ đệm ẩn không: Cache :: has ('myKey');

Có cách nào không, (khi sử dụng trình điều khiển bộ nhớ cache dựa trên tệp), để có danh sách tất cả các mục trong bộ nhớ cache?

Ví dụ, một cái gì đó mà có thể được đặt tên là một cái gì đó giống như "Cache :: tất cả()" rằng sẽ quay trở lại:

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

Cách duy nhất tôi có thể nghĩ để làm điều này là để lặp qua tất cả các tên quan trọng nhất bằng cách sử dụng phương thức Cache :: has(). tức là aaa, aab, aac, aad ... nhưng tất nhiên, đây không phải là giải pháp.

Tôi không thể thấy bất kỳ điều gì trong tài liệu hoặc API mô tả chức năng như thế này, nhưng tôi không nghĩ rằng nó không hợp lý để tin rằng người ta phải tồn tại.

+0

gì bộ nhớ đệm phụ trợ bạn đang sử dụng ? Redis? Memcached? hoặc là ? – alfallouji

+0

Bộ nhớ cache tệp. Tôi đã đọc có một chức năng giống như chức năng tôi mô tả cho Memcached, và có tùy chọn sử dụng thẻ. Nhưng tôi cần phải sử dụng tập tin như rất nhiều dữ liệu của nó. – kohloth

Trả lời

6

Không có cách nào để thực hiện điều đó bằng cách sử dụng Bộ nhớ cache mặt tiền. Giao diện của nó đại diện cho chức năng mà tất cả lưu trữ cơ bản và một số cửa hàng không cho phép liệt kê tất cả các khóa.

Nếu bạn đang sử dụng FileCache, bạn có thể cố gắng đạt được điều đó bằng cách tương tác trực tiếp với bộ nhớ cơ bản. Nó không cung cấp phương thức bạn cần, vì vậy bạn sẽ cần phải lặp qua thư mục cache. Nó sẽ không quá hiệu quả do có rất nhiều đĩa I/O mà có thể cần phải xảy ra.

Để truy cập lưu trữ, bạn cần làm

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

Xem http://stackoverflow.com/a/41566729/539149 cho phiên bản làm việc cho tôi trong Laravel 5.2 –

+0

điều này không hoạt động trên laravel 5.0 –

6

^này trên không làm việc trong LV 5.2

Hãy thử giải pháp này:

$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 { 

     } 
    } 
+0

Trên máy chủ của tôi, tôi thấy chúng không nằm trong một thư mục khác, vì vậy sẽ cần người khác {} $ keys = array_merge ($ keys, [$ file1-> getRealpath() => unserialize (substr (\ File :: get ($ file1-> getRealpath()), 10))]); – tristanbailey

+0

Đây là trên Laravel 5.3, như jedrzej.kurylo sẽ không hoạt động, điều này đã làm mặc dù – tristanbailey

+0

cũng hoạt động trên laravel 5.0 –

0
$redis = Cache::getRedis(); 
$a_keys = $redis->keys("*yourKeyGoesHere*"); 
foreach ($a_keys as $key){ 
    //Your Action ... 
    //For example forget key 
    $redis->del($key); 
} 
+0

Trong khi đoạn mã này có thể giải quyết câu hỏi, [bao gồm một lời giải thích] (http://meta.stackexchange.com/ câu hỏi/114762/giải thích toàn bộ mã dựa trên câu trả lời) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – Isma

Các vấn đề liên quan