「オブジェクト」をキーとしてオブジェクトに関するいくつかの準拠した情報を表す、適切なキャッシュキーを探しています。PHPシリアライズの代替
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));
です。
EDIT 2:
class Route
{
protected $pattern;
protected $defaults = array();
protected $requirements = array();
}
Pattern
とrequirements
は、これらの値のため、ハッシュこの方法の出力を変更するオブジェクトの値は以下のとおりです。私が働いているオブジェクトは、次の定義が含まれキャッシュキーに存在する必要があります。
また、同じ情報から同じIDを確実に再生成できないため、誰かがuniqid()を提案しました。これは一般的なキャッシュルックアップキーの目的を無効にします。
編集3:私は十分な文脈を与えていないと思います。
https://github.com/efritz/minuet/blob/master/src/Minuet/Routing/Router.php#L160
私は私は本当に唯一のシリアル化するために高価な呼び出しを避けるためにしようとしていると思います(と私はまた少し高価であるSHA1を、推測):ここでは、これまでのコードへのリンクがあります。私ができることは、シリアライズしているもののサイズを縮小しようとすることです...
"計算上の複雑さ"の何が問題になっていますか? –
実際に必要なサイクル数よりも多くのサイクルが実行されています;)現在、シリアライズは、キャッシュヒット時に、apc_fetch自体よりも時間がかかります。 – efritz
したがって、そのデータ項目の値に基づいてデータ項目を取得するか、あるいはデータ項目を保存しますか?これは意味をなさない - 値を取得するには、それが何であるかを既に知っていなければなりません! – symcbean