文档/容器/服务/Cache

数据缓存

框架的Cache服务是简单的数据文件缓存。 它的方法支持PSR-16。缓存的工作原理如下:
数据以唯一键存储于缓存中,并指定ttl(时间生存)以秒为单位。
从缓存创建开始的这段时间内,使用此键的缓存请求会返回缓存数据,数据保持不变。
可随时按键或全部清除缓存。
如果缓存未创建、清除或过期,将为指定时间创建新缓存。

内置服务实现支持主要的PHP数据类型——字符串、数值、数组、对象(通过序列化)。

如果需要更高级的缓存功能,可以在容器中添加另一个实现,替换或补充当前的实现。 这可以是github.com/symfony/cache组件。

在控制器(以及从Hleb\Base\Container继承的所有类)中使用Cache的方法,示例通过键获取缓存:

// variant 1
use Hleb\Reference\CacheInterface;
$data $this->container->get(CacheInterface::class)->get('cache_key');

// variant 2
$data $this->container->cache()->get('cache_key');

在应用代码中从Cache获取缓存的示例:

// variant 1
use Hleb\Static\Container;
use 
Hleb\Reference\CacheInterface;
$data Container::get(CacheInterface::class)->get('cache_key');

// variant 2
use Hleb\Static\Cache;
$data Cache::get('cache_key');

还可以通过接口Hleb\Reference\Interface\Cache使用依赖注入访问Cache对象。

为简化示例,后续将仅使用Hleb\Static\Cache访问。


#唯一键

这种缓存方法的最大挑战(除失效外)是选择一个能唯一标识缓存数据的唯一键。

例如,如果您正在缓存从数据库获取的特定查询的数据,则键应包含有关该查询的信息,以及数据库名称,如果类似的查询可能在不同数据库中执行。


#缓存初始化

在此示例中,将以一分钟的过期期将测试验证结果添加到缓存中。当然,在实用条件下,选择缓存数据时,应选择生成比使用缓存更耗费资源的数据。

use Hleb\Static\Cache;

$key 'example_cache_key';

if (!
Cache::has($key)) {
    
$data mt_rand(); // Receiving data.
    
Cache::set($key$datattl60);
} else {
    
$data Cache::get($key);
}

这里使用了 get()set()has() 方法,分别用于根据键获取、添加到缓存和检查其存在性。

这三个方法被一个名为 getConform() 的方法所取代,该方法使用 Closure 函数来获取数据,如果在缓存中找不到它们。

use Hleb\Static\Cache;

$data Cache::getConform('example_cache_key', function () {
    return 
mt_rand(); // Receiving data.
}, ttl60);

使用外部上下文的闭包函数示例:

use Hleb\Static\Cache;

$param 10;
$data Cache::getConform('example_cache_key',
    function () use (
$param) {
        return 
mt_rand() * $param// Data calculation.
    
}, ttl60);

#清除缓存

整个框架的缓存通过 clear() 方法清除,但对大量缓存要谨慎使用。此调用应相对不频繁使用,也可以通过控制台命令来完成:

$php console --clear-cache

清除整个缓存只会影响缓存的模板数据和由 Cache 服务添加的框架数据。 TWIG 模板引擎有自己的缓存实现,并且提供了一个单独的控制台命令来清除它。

如果需要按某个键删除缓存,可以使用 delete() 方法。

为了让框架自动跟踪缓存的最大大小,需要在 /config/common.php 文件中配置 'max.cache.size' 选项。
该值以兆字节为单位的整数表示。 由于缓存文件不均匀分布,这将是缓存文件目录最大大小的大致跟踪。

如果不发生缓存,请确保在 /config/common.php 文件中启用 'app.cache.on' 设置;建议在调试模式下禁用它。

Response 日志记录

页面翻译:chatgpt 4-o
返回顶部