// initiate the memcached instance
$cache = new \Memcached();
$cache->addServer('localhost', '11211');
// get all stored memcached items
$keys = $cache->getAllKeys();
$cache->getDelayed($keys);
$store = $cache->fetchAll();
// delete by regex keys
$keys = $cache->getAllKeys();
$regex = 'product_.*';
foreach($keys as $item) {
if(preg_match('/'.$regex.'/', $item)) {
$cache->delete($item);
}
}Memcached::getAllKeys
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Memcached::getAllKeys
Референца за `memcached.getallkeys.php` со подобрена типографија и навигација.
Memcached::getAllKeys
(PECL memcached >= 2.0.0)
Memcached::getAllKeys — (PECL memcached >= 2.0.0)
= NULL
Ги добива клучевите зачувани на сите сервери Memcached::getAllKeys()
Забелешка:
ги прашува секој memcache сервер и добива низа од сите клучеви зачувани на нив во тој момент. Ова не е атомска операција, така што не е навистина конзистентен преглед на клучевите во одреден момент. Бидејќи memcache не гарантира враќање на сите клучеви, исто така не можете да претпоставите дека сите клучеви се вратени.
Параметри
Оваа функција нема параметри.
Вратени вредности
Овој метод е наменет за цели на отстранување грешки и не треба да се користи во голем обем! false при неуспех.
Белешки од корисници 4 белешки
The right way to dump slab keys seems to be by using lru_crawler metadump instead of stats cachedump, see https://github.com/memcached/memcached/issues/405
<?php
function getAllKeys(string $host, int $port): array
{
$sock = fsockopen($host, $port, $errno, $errstr);
if ($sock === false) {
throw new Exception("Error connection to server {$host} on port {$port}: ({$errno}) {$errstr}");
}
if (fwrite($sock, "stats items\n") === false) {
throw new Exception("Error writing to socket");
}
$slabCounts = [];
while (($line = fgets($sock)) !== false) {
$line = trim($line);
if ($line === 'END') {
break;
}
// STAT items:8:number 3
if (preg_match('!^STAT items:(\d+):number (\d+)$!', $line, $matches)) {
$slabCounts[$matches[1]] = (int)$matches[2];
}
}
foreach ($slabCounts as $slabNr => $slabCount) {
if (fwrite($sock, "lru_crawler metadump {$slabNr}\n") === false) {
throw new Exception('Error writing to socket');
}
$count = 0;
while (($line = fgets($sock)) !== false) {
$line = trim($line);
if ($line === 'END') {
break;
}
// key=foobar exp=1596440293 la=1596439293 cas=8492 fetch=no cls=24 size=14908
if (preg_match('!^key=(\S+)!', $line, $matches)) {
$allKeys[] = $matches[1];
$count++;
}
}
// if ($count !== $slabCount) {
// throw new Exception("Surprise, got {$count} keys instead of {$slabCount} keys");
// }
}
if (fclose($sock) === false) {
throw new Exception('Error closing socket');
}
return $allKeys;
}First I use the lastest memcached version 1.4.25, but unfortunately I found memcached::getAllkeys do not work with it, though i follow the others suggestion to disable Memcached::OPT_BINARY_PROTOCOL. So i try to use history versions, when i use memcached version 1.4.17, it works./**
* Get all memcached keys. Special function because getAllKeys() is broken since memcached 1.4.23. Should only be needed on php 5.6
*
* cleaned up version of code found on Stackoverflow.com by Maduka Jayalath
*
* @return array|int - all retrieved keys (or negative number on error)
*/
public function getMemcachedKeys($host = '127.0.0.1', $port = 11211)
{
$mem = @fsockopen($host, $port);
if ($mem === false)
{
return -1;
}
// retrieve distinct slab
$r = @fwrite($mem, 'stats items' . chr(10));
if ($r === false)
{
return -2;
}
$slab = [];
while (($l = @fgets($mem, 1024)) !== false)
{
// finished?
$l = trim($l);
if ($l == 'END')
{
break;
}
$m = [];
// <STAT items:22:evicted_nonzero 0>
$r = preg_match('/^STAT\sitems\:(\d+)\:/', $l, $m);
if ($r != 1)
{
return -3;
}
$a_slab = $m[1];
if (!array_key_exists($a_slab, $slab))
{
$slab[$a_slab] = [];
}
}
reset($slab);
foreach ($slab as $a_slab_key => &$a_slab)
{
$r = @fwrite($mem, 'stats cachedump ' . $a_slab_key . ' 100' . chr(10));
if ($r === false)
{
return -4;
}
while (($l = @fgets($mem, 1024)) !== false)
{
// finished?
$l = trim($l);
if ($l == 'END')
{
break;
}
$m = [];
// ITEM 42 [118 b; 1354717302 s]
$r = preg_match('/^ITEM\s([^\s]+)\s/', $l, $m);
if ($r != 1)
{
return -5;
}
$a_key = $m[1];
$a_slab[] = $a_key;
}
}
// close the connection
@fclose($mem);
unset($mem);
$keys = [];
reset($slab);
foreach ($slab AS &$a_slab)
{
reset($a_slab);
foreach ($a_slab AS &$a_key)
{
$keys[] = $a_key;
}
}
unset($slab);
return $keys;
}