# 自动缓存 * * * * * 上面的Redis在TP5中叫做缓存驱动,本章讲的自动缓存跟驱动无关,也就是不管使用什么缓存驱动都可以使用自动缓存。 此处以初始化钩子信息行为中的代码举个栗子 **自动缓存使用前代码** ~~~ $list = cache('hook_list'); if (empty($list)) : $list = $hook->column('id,name,addon_list'); empty($list) && cache('hook_list', $list, 3); endif; ~~~ **自动缓存使用后代码** ~~~ $list = auto_cache('hook_list', create_closure($hook, 'column', ['id,name,addon_list'])); ~~~ 两段代码都是查询出钩子列表信息并缓存3秒。 下面来看看这两个函数的实现代码 ~~~ /** * 通过类创建逻辑闭包 */ function create_closure($object = null, $method_name = '', $parameter = []) { $func = function() use($object, $method_name, $parameter) { return call_user_func_array([$object, $method_name], $parameter); }; return $func; } ~~~ 从函数可以看出来 通过传入对象,操作方法,参数 构建了一个闭包,但是闭包并没有执行,意味着此处没有进行数据库查询操作,然后将闭包返回。 ~~~ /** * 通过闭包控制缓存 */ function auto_cache($key = '', $func = null, $time = 3) { $result = cache($key); if (empty($result)) : $result = $func(); !empty($result) && cache($key, $result, $time); endif; return $result; } ~~~ auto_cache 函数的参数则是 缓存的key,闭包,缓存时间。 可以看到auto_cache函数中会先进行缓存存在的验证,如果存在缓存则直接返回数据,若不存在则执行闭包进行数据库查询并缓存。 auto_cache('hook_list', create_closure($hook, 'column', ['id,name,addon_list'])); 那么结合在一起就是通过create_closure函数创建了一个带数据库查询操作的闭包但是并没有执行数据库操作,而是在auto_cache函数中先验证缓存是否存在,若不存在才执行闭包中的查询操作并返回数据。