我正在寻找一个适合APC的缓存键,它可以代表某个对象的一些编译信息,以“对象”作为键。我有一个编译方法,类似于以下内容:
function compile(Obj $obj)
{
if ($this->cache)
{
$cachekey = serialize($obj);
if ($data = $this->cache->get($obj))
{
return $data
}
}
// compute result here
if ($this->cache)
{
$this->cache->set($cachekey, $result);
}
return $result;
}
如果不明显的话,
$this->cache
是实现具有 get
和 set
方法的接口的一种方式。有没有更快的方法来创建一个仅对该对象的某些属性唯一的密钥?我可以提取相关部分,但它们仍然是数组,这将与我在第一次使用对象时遇到的序列化问题相同。
从“正确性”的角度来看,序列化可以工作,但它似乎是浪费的(无论是输出键的大小还是计算复杂度)。
编辑:我还想补充一点,如果不明显的话,我将不需要反序列化此对象。 我目前缓存密钥的原始代码实际上是:
$cachekey = 'compile.' . sha1(serialize($obj));
。编辑2:我正在使用的对象具有以下定义:
class Route
{
protected $pattern;
protected $defaults = array();
protected $requirements = array();
}
Pattern
和requirements
是该方法输出结果会改变的对象的值,因此这些值的哈希必须存在于缓存键中。
另外,有人建议使用uniqid(),这将破坏通用缓存查找键的目的,因为您无法可靠地从相同的信息重新生成相同的ID。
编辑3:我想我没有给出足够的上下文。这里是到目前为止的代码链接:
https://github.com/efritz/minuet/blob/master/src/Minuet/Routing/Router.php#L160
我想我真正想要做的只是避免昂贵的序列化调用(还有sha1,也有点昂贵)。可能我所能做的最好的就是尽量减小我正在序列化的内容的大小...