Sean的debug_zval_dump函数看起来像将会告诉你refcount的工作,但是真正的refcount从长远来看并不能帮助你.
您应该考虑使用有界数组作为缓存;这样的:
class object_cache {
var $objs = array();
var $max_objs = 1024; // adjust to fit your use case
function add($obj) {
$key = $obj->getKey();
// remove it from its old position
unset($this->objs[$key]);
// If the cache is full, retire the eldest from the front
if (count($this->objs) > $this->max_objs) {
$dead = array_shift($this->objs);
// commit any pending changes to db/disk
$dead->flushToStorage();
}
// (re-)add this item to the end
$this->objs[$key] = $obj;
}
function get($key) {
if (isset($this->objs[$key])) {
$obj = $this->objs[$key];
// promote to most-recently-used
unset($this->objs[$key]);
$this->objs[$key] = $obj;
return $obj;
}
// Not cached; go and get it
$obj = $this->loadFromStorage($key);
if ($obj) {
$this->objs[$key] = $obj;
}
return $obj;
}
}
在这里,getKey()返回要存储的对象的唯一ID.
这取决于PHP记住插入其哈希表的顺序;每次添加一个新元素时,它将被逻辑地附加到数组中.
get()函数确保您访问的对象保存在数组的末尾,因此数组的前面将是最近最少使用的元素,这是我们在决定时要处理的元素那个空间很小array_shift()对我们这样做.
这种方法也被称为最近使用的或MRU缓存,因为它缓存最近使用的项目.这个想法是,您更有可能访问最近访问的项目,因此您可以保留它们.
你在这里得到的是控制最大数量的对象的能力,你不需要在特定难以访问的php实现细节上徘徊.