我使用数据类来为我的数据提供模板,我想从数据类中的数据计算一个唯一的id,这样我就可以检查具有该数据的模板是否已经在缓存中,然后提供该版本。
所以从类数组中获取唯一id的函数可以帮助我
这样的事情有效,但相当昂贵 MD5化(serialize($ classdata))我希望有一些功能可以在不序列化所有数据的情况下获取唯一ID,或者至少不需要在php中
提前致谢, 最好的,保罗
编辑: 我很快庆祝,唯一的id在当前情况下是相同的 重新启动相同的脚本会产生另一个id,然后当然不在缓存中 使用的测试文件:
<?php
class foo {}
$f = new foo;
print spl_object_hash($f);
更深入地解释
class template_data implements IteratorAggregate, ArrayAccess, Countable {
private $_data;
//some methods for the overloaded classes
//
//the getId function
public function getId() {
return hash('md5',serialize($this->_data));
}
}
$t = new template('file');
$d = new template_data('some data');
$t->addData($d);
$t->display();
现在,如果提供给模板引擎的数据在缓存中,则使用该版本 防止必须重新解析数据集的模板
这是一个简单的template_data视图,它实际上是延迟加载并使用memcached dataid,所以数据实际上并没有被提取,直到它在模板中使用
答案 0 :(得分:5)
答案 1 :(得分:2)
PHP不会创建在对象的执行之间持续存在的唯一ID,这意味着您将正确地生成所需的行为。因此,虽然对于问题没有好的答案,但我可以提出一些建议,以降低生成ID的成本。
首先,您可以使用json_encode
而不是serialize
。其次,您可以存储该值,以便多次调用该函数不会每次都重新序列化数据。
json_encode
函数不仅比serialize
快,而且还会产生一个较短的字符串作为输出。http://cw-internetdienste.de/2015/05/04/serialize-vs-json_encode/
class template_data implements IteratorAggregate, ArrayAccess, Countable {
private $_data;
private $_id;
//
//some methods for the overloaded classes
//
//the getId function
public function getId() {
if(empty($this->_id))
$this->_id = hash('md5',json_encode($this->_data));
return $this->_id;
}
}
最后;最好的解决方案可能是使用路由缓存模板的输出,或者参数作为唯一缓存键的基础而不是使用的单个数据集。
答案 2 :(得分:1)
为什么不查看并覆盖对象上的__toString()
方法来获取和散列对象中的相关数据。
例如
class Object
{
// Some vars
public $name = "Jake";
public $age = 26;
public $dob = "1/1/10"
// the toString method
public function __toString()
{
return md5($this->name . $this->age . $this->dob);
}
}
// Create new object
$object = new Object();
// echo the object, this automatically calls your __toString method
echo $object
在这种情况下,您不使用序列化,这是代价高昂的,而只是使用__toString()
根据与对象一起存储的变量生成您自己的唯一ID。