10

データクラスを使用してテンプレートにデータをフィードします。データクラスのデータから一意のIDを計算して、そのデータを含むテンプレートが既にキャッシュにあるかどうかを確認して、そのバージョンを提供できるようにします。

そのため、クラスの配列から一意のIDを取得する関数が役に立ちます。

このようなものは機能しますが、かなりコストがかかりますmd5(serialize($classdata))

すべてのデータをシリアル化せずに、または少なくともphpでシリアル化する必要がなく、一意のIDを取得する関数があることを期待しています。

編集:
私はあまりにも早く祝いました。一意の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。第 2 に、関数を複数回呼び出しても毎回データが再シリアル化されないように、値を格納できます。

この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 に答える