PHP 8.4.2 Released!

Memcached::getAllKeys

(PECL memcached >= 2.0.0)

Memcached::getAllKeysObtém as keys armazenadas em todos os servidores

Descrição

public Memcached::getAllKeys(): array|false

Memcached::getAllKeys() consulta cada servidor memcache e recupera um array com todas as keys armazenadas neles naquele momento. Esta não é uma operação atômica, portanto, não é um instantâneo verdadeiramente consistente das keys no momento. Como o memcache não garante o retorno de todas as keys, você também não pode presumir que todas as keys foram retornadas.

Nota:

Este método destina-se a fins de depuração e não deve ser usado em escala!

Parâmetros

Esta função não possui parâmetros.

Valor Retornado

Retorna as keys armazenadas em todos os servidores em caso de sucesso ou false em caso de falha.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 4 notes

up
6
flaviu dot chelaru at gmail dot com
7 years ago
// 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);
}
}
up
3
xiangku7890 at gmail dot com
8 years ago
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.
up
1
danb1974 at gmail dot com
4 years ago
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;
}
up
1
harold at snel dot me
5 years ago
/**
* 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;
}
To Top