10

我使用一个数据类来为模板提供我的数据,我想从数据类中的数据计算一个唯一的 id,这样我就可以检查带有该数据的模板是否已经在缓存中,然后提供该版本。

所以从类的数组中获取唯一ID的函数会帮助我。

像这样的东西有效但相当昂贵md5(serialize($classdata))

我希望有一些函数可以在不序列化所有数据的情况下获取唯一 ID,或者至少不必在 php.ini 中序列化所有数据。

编辑:
我庆祝得太早了,唯一的 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,因此在模板中使用数据之前不会实际获取数据。

4

3 回答 3

5

你可以试试spl_object_hash()

从文档

此函数返回对象的唯一标识符。此 id 可用作存储对象或标识对象的哈希键。

于 2011-01-19T10:13:40.773 回答
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;
    }
}

最后; 最好的解决方案可能是使用路由或参数作为唯一缓存键的基础而不是使用的单个数据集来缓存模板的输出。

于 2016-02-22T04:02:59.947 回答
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。

于 2011-01-19T21:24:16.243 回答