4

関数の結果をキャッシュするためのシンプルなツールを作成しています

ように見えます:

global $function_results;
$function_results = array();

function getMembers($conditions, $default = array('order' => 'name', array('abc', 'def'))){

    //****Help need from here******
    //make unique id from parameters value and function name
    //ex: $uid;
    //****to here******

    global $function_results;
    if(isset($function_results[$uid])) return $function_results[$uid];
    else{
        //do function logic...
    }
}

(関数とそのパラメーターは単なる例です)

助言がありますか?

4

4 に答える 4

10

不足しているコードは次のとおりです。

$numargs = func_num_args();
$arg_list = func_get_args();
$md5this = '';
for ($i = 0; $i < $numargs; $i++) {
    $md5this .= $i.':'.serialize($arg_list[$i]).';';
}
$uid = md5($md5this);

参考までに:http://php.net/manual/en/function.func-get-args.php

于 2010-08-22T06:19:45.933 に答える
5

これは、 PHP5.2.xと互換性のある一般的なメモ化ソリューションです。

call_memoized関数:

  1. 関数名と引数に基づいて一意のキャッシュキーを生成します。
  2. キャッシュが空の場合、関数を呼び出し、結果でキャッシュを更新します。
  3. キャッシュされた値を返します。

call_memoizedを直接使用する代わりに、提供されたmemoize関数を使用します。この関数は、パラメーターの同じ組み合わせからの結果を自動的にキャッシュする、指定された関数の新しいバージョンを返します。

以下の例を参照してください。

楽しみ!

global $MEMO_CACHE;
$MEMO_CACHE = array();

/** Returns the result of the function with the given arguments. 
 * Invokes the function only once, thereafter returns the result 
 * cached by a key based on the function name and arguments. */
function call_memoized($fun, $args=array()) {
    global $MEMO_CACHE;

    // generate a cache key based on the function name and arguments
    $uid = md5(
        implode("|", array_merge((array)$fun, array_map(
            "serialize",
            $args)
        ))
    );

    // if there result hasn't been cached, call the function 
    // and update the cache with the result.
    if(!array_key_exists($uid, $MEMO_CACHE)) {
        $MEMO_CACHE[$uid] = call_user_func_array($fun, $args);
    }

    return $MEMO_CACHE[$uid];
}

/** Returns a memoized version of the given function that will cache 
 * its results for each unique set of inputs. */
function memoize($fun) {
    return create_function(
        '', 
        "\$args = func_get_args(); return call_memoized('$fun', \$args);"
    );
}

例:

/** Returns a random number with the given greeting. */
function random($greeting) {
    return "$greeting! " . rand();
};

print("Five random numbers:</br />");
for($i=0; $i<5; $i++) {
    print(random("Spin the wheel") . "<br />");
}
print "<br />";

print("After memoizing the random function, it's not so random:<br />");
$not_so_random = memoize("random");
for($i=0; $i<5; $i++) {
    print($not_so_random("Spin the wheel") . "<br />");
}
print "<br />";

print("The same memoized function is invoked with a different argument, and 
       thus creates a different cache key:<br />");
for($i=0; $i<5; $i++) {
    print($not_so_random("Twirl the tire") . "<br />");
}

/* OUTPUT

Five random numbers:
Spin the wheel! 26488
Spin the wheel! 20049
Spin the wheel! 14006
Spin the wheel! 28599
Spin the wheel! 804

After memoizing the random function, it's not so random:
Spin the wheel! 32397
Spin the wheel! 32397
Spin the wheel! 32397
Spin the wheel! 32397
Spin the wheel! 32397

The same memoized function is invoked with a different argument, and 
thus creates a different cache key:
Twirl the tire! 2114
Twirl the tire! 2114
Twirl the tire! 2114
Twirl the tire! 2114
Twirl the tire! 2114
*/
于 2011-05-29T18:12:25.150 に答える
3

いくつ$conditionsかの値の配列であり、その配列のバリアントごとに一意の識別子を作成したいと思いますか?これを行うにはいくつかの方法があります。例:

$uid = md5(serialize($conditions));
于 2010-08-22T06:16:53.157 に答える
3

Nsplからのメモ化された関数の実装を見てください:

function memoized(callable $function)
{
    return function() use ($function) {
        static $memory = array();
        $args = func_get_args();
        $key = serialize($args);
        if (!isset($memory[$key]) && !array_key_exists($key, $memory)) {
            $memory[$key] = call_user_func_array($function, $args);
        }

        return $memory[$key];
    };
}

または、サーバーリクエスト間で関数の結果をキャッシュする場合は、Cachalotを使用できます。

$cache = new \Cachalot\ApcCache();
$result = $cache->getCached($function, $args);

さまざまなバックエンドがサポートされています:Apc、Xcache、Memcached、Redis、Couchbase。

于 2016-01-10T22:24:37.557 に答える