Memcached::getAllKeys

(PECL memcached >= 2.0.0)

Memcached::getAllKeys获取存储在所有服务器上的键

描述

public Memcached::getAllKeys(): array|false

Memcached::getAllKeys() 查询每个 memcache 服务器并检索在该时间点存储在它们上的所有键的数组。这不是一个原子操作,因此它不是该时间点键的真正一致快照。由于 memcache 不保证返回所有键,因此您也不能假设所有键都已返回。

注意:

此方法旨在用于调试目的,不应在规模上使用!

参数

此函数没有参数。

返回值

成功时返回存储在所有服务器上的键,失败时返回 **false**。

添加笔记

用户贡献笔记 6 笔记

6
flaviu dot chelaru at gmail dot com
7 年前
// 初始化 memcached 实例
$cache = new \Memcached();
$cache->addServer('localhost', '11211');

// 获取所有存储的 memcached 项

$keys = $cache->getAllKeys();
$cache->getDelayed($keys);

$store = $cache->fetchAll();

// 按正则表达式键删除

$keys = $cache->getAllKeys();
$regex = 'product_.*';
foreach($keys as $item) {
if(preg_match('/'.$regex.'/', $item)) {
$cache->delete($item);
}
}
4
xiangku7890 at gmail dot com
8 年前
首先我使用的是最新的 memcached 版本 1.4.25,但不幸的是我发现 memcached::getAllkeys 不适用于它,尽管我遵循其他人的建议来禁用 Memcached::OPT_BINARY_PROTOCOL。所以我尝试使用历史版本,当我使用 memcached 版本 1.4.17 时,它可以工作。
1
danb1974 at gmail dot com
4 年前
转储 slab 键的正确方法似乎是使用 lru_crawler metadump 而不是 stats cachedump,请参阅 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;
}
1
harold at snel dot me
5 年前
/**
* 获取所有 memcached 键。特殊函数,因为 getAllKeys() 自 memcached 1.4.23 以来已损坏。应该只在 php 5.6 上需要
*
* 来自 Stackoverflow.com 的 Maduka Jayalath 的代码的清理版本。
*
* @return array|int - 所有检索到的键(或错误时的负数)
*/
public function getMemcachedKeys($host = '127.0.0.1', $port = 11211)
{
$mem = @fsockopen($host, $port);
if ($mem === false)
{
return -1;
}

// 检索不同的 slab
$r = @fwrite($mem, 'stats items' . chr(10));
if ($r === false)
{
return -2;
}

$slab = [];
while (($l = @fgets($mem, 1024)) !== false)
{
// 完成了吗?
$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)
{
// 完成了吗?
$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;
}
}

// 关闭连接
@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;
}
-7
Cuchac
9 年前
当使用二进制协议时,此命令始终返回 FALSE (Memcached::OPT_BINARY_PROTOCOL = true)。没有二进制协议,它可以工作。
-7
fykknd at 163 dot com
8 年前
我得到了这个答案..
我的 libmemcached 版本是 1.0.18。php-memcached 版本是 2.2.0
在 Libmemcached 的 memcache.h 文件第 84 行
#define MAX_NUMBER_OF_SLAB_CLASSES (63 + 1)
将其修改为 201,重新编译。没问题。
主要还是版本不兼容造成的。libmemchaed里一个bug,
memcached_return_t这个方法里的for循环,最大数是200,和上面的常量64定义不一致造成的。
To Top