缓存块载入

Testing Is Documentation

tests/Cache/LoadTest.php缓存块载入 - 图1

QueryPHP 提供了缓存块自动载入功能,缓存块类似于缓存的 remember 功能,一个类代表一个缓存块。

定义缓存块

例子 \Tests\Cache\Pieces\Test1

  1. namespace Tests\Cache\Pieces;
  2. use Leevel\Cache\File;
  3. use Leevel\Cache\IBlock;
  4. use Leevel\Cache\ICache;
  5. class Test1 implements IBlock
  6. {
  7. public function handle(array $params = []): array
  8. {
  9. return ['foo' => 'bar'];
  10. }
  11. public function cache(): ICache
  12. {
  13. return new File([
  14. 'path' => __DIR__.'/cacheLoad',
  15. ]);
  16. }
  17. public static function key(array $params = []): string
  18. {
  19. return 'test1';
  20. }
  21. }

缓冲块需要实现 \Leevel\Cache\IBlock 接口,即可统一进行管理。

接口 \Leevel\Cache\IBlock

  1. namespace Leevel\Cache;
  2. interface IBlock
  3. {
  4. /**
  5. * 响应.
  6. */
  7. public function handle(array $params = []): array;
  8. /**
  9. * 缓存驱动.
  10. *
  11. * @return \Leevel\Cache\ICache
  12. */
  13. public function cache(): ICache;
  14. /**
  15. * 缓存 key.
  16. */
  17. public static function key(array $params = []): string;
  18. }

缓存块实现非常灵活,可以非常轻松地使用。

载入缓存片段

缓存载入服务 cache.load 被系统注册到服务容器中了,可以使用代理 proxy 来调用。

  1. \Leevel\Cache\Proxy\Load::data(array $names, ?int $expire = null, bool $force = false): array;
  2. \Leevel\Cache\Proxy\Load::refresh(array $names): void;

Uses

  1. <?php
  2. use Leevel\Cache\Load;
  3. use Leevel\Di\Container;
  4. use Tests\Cache\Pieces\Test1;
  5. use Tests\Cache\Pieces\Test2;
  6. use Tests\Cache\Pieces\Test4;

data 载入缓存块数据

通过 data 即可载入缓存块数据,缓存直接传递缓存块的类名字即可。

  1. # Leevel\Cache\ILoad::data
  2. /**
  3. * 载入缓存数据.
  4. *
  5. * - 系统自动存储缓存到内存,可重复执行不会重复载入数据.
  6. */
  7. public function data(array $names, ?int $expire = null, bool $force = false): array;

配置 $expire 和缓存功能中的 set 的用法一致。

  1. public function testBaseUse(): void
  2. {
  3. $container = new Container();
  4. $load = $this->createLoad($container);
  5. $result = $load->data([Test1::class]);
  6. $this->assertSame(['foo' => 'bar'], $result);
  7. $result = $load->data([Test1::class]);
  8. $this->assertSame(['foo' => 'bar'], $result);
  9. $load->refresh([Test1::class]);
  10. }

refresh 刷新缓存块数据

通过 refresh 即可刷新缓存块数据,缓存直接传递缓存块的类名字即可。

  1. # Leevel\Cache\ILoad::refresh
  2. /**
  3. * 刷新缓存数据.
  4. */
  5. public function refresh(array $names): void;

刷新缓存块本质是删除缓存块数据,下次请求自动生成。

  1. public function testRefresh(): void
  2. {
  3. $container = new Container();
  4. $load = $this->createLoad($container);
  5. $result = $load->data([Test1::class]);
  6. $this->assertSame(['foo' => 'bar'], $result);
  7. $result = $load->data([Test1::class]);
  8. $this->assertSame(['foo' => 'bar'], $result);
  9. $file = __DIR__.'/Pieces/cacheLoad/test1.php';
  10. $this->assertTrue(is_file($file));
  11. $load->refresh([Test1::class]);
  12. $this->assertFalse(is_file($file));
  13. }

data 强制载入缓存块数据

data 方法支持强制获取缓存数据。

  1. public function testDataForce(): void
  2. {
  3. $container = new Container();
  4. $load = $this->createLoad($container);
  5. $result = $load->data([Test1::class]);
  6. $this->assertSame(['foo' => 'bar'], $result);
  7. $result = $load->data([Test1::class], null, true);
  8. $this->assertSame(['foo' => 'bar'], $result);
  9. }

TIP

$force 参数强制从原始数据源获取缓存,并且会刷新缓存数据。

data 载入缓存块数据支持参数

data 方法支持传递一些参数到缓存块,可以生成不同的缓存数据。

例子 \Tests\Cache\Pieces\Test1

  1. namespace Tests\Cache\Pieces;
  2. use Leevel\Cache\File;
  3. use Leevel\Cache\IBlock;
  4. use Leevel\Cache\ICache;
  5. class Test4 implements IBlock
  6. {
  7. public function handle(array $params = []): array
  8. {
  9. return $params;
  10. }
  11. public function cache(): ICache
  12. {
  13. return new File([
  14. 'path' => __DIR__.'/cacheLoad',
  15. ]);
  16. }
  17. public static function key(array $params = []): string
  18. {
  19. return 'test4';
  20. }
  21. }

参数通过 : 冒号进行分割,冒号后边是自定义参数。

  1. public function testWithParams(): void
  2. {
  3. $container = new Container();
  4. $load = $this->createLoad($container);
  5. $result = $load->data([Test4::class.':hello,world,foo,bar']);
  6. $this->assertSame(['hello', 'world', 'foo', 'bar'], $result);
  7. }