/**
* 取得所有 memcached 金鑰。特殊函式,因為自 memcached 1.4.23 以來 getAllKeys() 已損壞。應該只需要在 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;
}