dominionenterprises / memoize
v3.0.0
2024-08-13 15:23 UTC
Requires
- php: ^7.0 || ^8.0
Requires (Dev)
- php-coveralls/php-coveralls: ^1.0
- phpunit/phpunit: ^6.0 || ^7.0 || ^8.0 || ^9.0
- predis/predis: ^1.0
- squizlabs/php_codesniffer: ^3.2
Suggests
- predis/predis: Allows for Redis-based memoization.
README
一个用于缓存重复函数调用的PHP库。
要求
此库需要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);