此包已被废弃,不再维护。作者建议使用traderinteractive/memoize包。

用于缓存重复函数调用的库。

v3.0.0 2024-08-13 15:23 UTC

This package is auto-updated.

Last update: 2024-08-13 15:25:22 UTC


README

一个用于缓存重复函数调用的PHP库。

Build Status Scrutinizer Code Quality Code Coverage

Latest Stable Version Total Downloads License

要求

此库需要PHP 7.0或更高版本。

安装

此包使用composer,因此您只需将traderinteractive/memoize作为依赖项添加到您的composer.json文件中。

缓存

缓存是通过缓存函数调用的结果来优化反复调用的函数的一种方法。

缓存提供者

此库包括几个内置的缓存提供者。每个提供者都实现了\TraderInteractive\Memoize\Memoize接口。

interface Memoize
{
    /**
     * Gets the value stored in the cache or uses the passed function to
     * compute the value and save to cache.
     *
     * @param string $key The key to fetch
     * @param callable $compute A function to run if the value was not cached
     *     that will return the result.
     * @param int $cacheTime The number of seconds to cache the response for,
     *     or null to not expire it ever.
     * @return mixed The data requested, optionally pulled from cache
     */
    public function memoizeCallable($key, $compute, $cacheTime = null);
}

$compute可调用对象不能接受任何参数 - 如果您需要参数,请考虑将您的函数包装在一个闭包中,该闭包将所需参数引入作用域。例如,给定以下函数:

$getUser = function($database, $userId) {
  $query = $database->select('*')->from('user')->where(['id' => $userId]);
  return $query->fetchOne();
};

您可以将此函数包装在闭包中,如下所示:

$getLoggedInUser = function() use($database, $loggedInUserId, $getUser) {
    return $getUser($database, $loggedInUserId);
};

$memoize->memoizeCallable("getUser-{$loggedInUserId}", $getLoggedInUser);

或者,您可以反转它并返回闭包,如下所示:

$getUserLocator = function($database, $userId) use($getUser) {
    return function() use($database, $userId, $getUser) {
        return $getUser($database, $userId);
    };
};

$getLoggedInUser = $getUserLocator($database, $loggedInUserId);
$memoize->memoizeCallable("getUser-{$loggedInUserId}", $getLoggedInUser);

此库的后续版本可能会添加对参数的支持,因为它是一个常见的用例(尤其是在递归函数的情况下)。

还值得注意的一点是,您需要确保为使用缓存器的任何内容定义唯一的缓存键。

Predis

此提供者使用predis库在Redis中缓存结果。它支持$cacheTime参数,以便在时间到期后重新计算结果。

此缓存器可以用作在进程之间持久化,而不是仅缓存当前进程的计算。

示例

$predis = new \Predis\Client($redisUrl);
$memoize = new \TraderInteractive\Memoize\Predis($predis);

$compute = function() {
    // Perform some long operation that you want to memoize
};

// Cache he results of $compute for 1 hour.
$result = $memoize->memoizeCallable('myLongOperation', $compute, 3600);

内存

这是一个标准内存缓存器。目前它不支持$cacheTime,并且仅在缓存器在内存中的时候保留结果。

示例

$memoize = new \TraderInteractive\Memoize\Memory();

$compute = function() {
    // Perform some long operation that you want to memoize
};

$result = $memoize->memoizeCallable('myLongOperation', $compute);

此缓存器实际上不会缓存任何内容 - 它总是调用$compute函数。它适用于测试,也可以在您禁用缓存以进行调试等时使用,因为您可以用此缓存器替换您的真实缓存器,一切仍然可以正常工作。

示例

$memoize = new \TraderInteractive\Memoize\None();

$compute = function() {
    // Perform some long operation that you want to memoize
};

// This will never actually memoize the results - they will be recomputed every
// time.
$result = $memoize->memoizeCallable('myLongOperation', $compute);