phpro/annotated-cache

此包已被放弃,不再维护。未建议替代包。

此包使您可以通过注解轻松配置服务的缓存。

v0.2.0 2016-05-09 06:54 UTC

This package is auto-updated.

Last update: 2020-12-27 13:12:11 UTC


README

仓库于2020-11-27已弃用

由于我们不再内部使用此仓库,已将其存档。您可以自由使用,我们将不再提供任何支持。

Build status Insight Installs Packagist

缓存注解

停止担心缓存问题,使用注解代替。此PHP库使您能够为您的服务添加注解并为您处理缓存。您可以使用任何PSR-6缓存实现作为缓存后端。

安装

composer require phpro/annotated-cache

我们建议使用php-cache以使您能够为缓存项添加标签。

桥梁

使用方法

示例使用

use Phpro\AnnotatedCache\Factory;

$poolManager = Factory::createPoolManager();
$poolManager->addPool('products', $psr6CachePool);

$cacheHandler = Factory::createCacheHandler($poolManager);
$proxyGenerator = Factory::createProxyGenerator($cacheHandler);

$myService = $proxyGenerator->generate(new My\Service());

我们使缓存管理器的入门尽可能简单。您需要以下3个服务

  • PoolManager:包含一个或多个PSR-6缓存池。
  • CacheHandler:包含PoolManager和与缓存池交互的逻辑。
  • ProxyGenerator:使用访问拦截器值持有者包装您的服务

示例服务

<?php

namespace My;

use Phpro\AnnotatedCache\Annotation\Cacheable;
use Phpro\AnnotatedCache\Annotation\CacheUpdate;
use Phpro\AnnotatedCache\Annotation\CacheEvict;

class Service
{

    /**
     * @Cacheable(pools="products", key="sku", tags="product-detail", ttl=300)
     */
    public function getProduct($sku, $type = 'book')
    {
        // fetch a product from a repository or whatever
        $product = $this->productRepository->getByType($sku, 'book');

        return $product;
    }

    /**
     * @CacheEvict(pools="products", key="product.getSku()", tags="product-overview,product-reports")
     */
    public function removeProduct(Product $product)
    {
        // saving product ...
    }

    /**
     * @CacheUpdate(pools="products", key="product.getSku()", tags="product-detail", ttl=300)
     */
    public function updateProduct(Product $product)
    {
        // saving product....
        return $product;
    }
}

注解

此包提供了以下注解

@Cacheable 注解

@Cacheable 注解用于自动将方法的结果存储到缓存中。

当调用带有@Cacheable注解的方法时,包会检查缓存中是否存在条目,然后再执行方法。如果找到了,则会返回缓存结果,而不必实际执行方法。

如果没有找到缓存条目,则执行方法,并将结果自动存储到缓存中。

<?php

namespace My\Manager;

use My\Model\Product;

use Phpro\AnnotatedCache\Annotation\Cacheable;

class ProductManager
{
    /**
     * @Cacheable(pools="products", key="sku", tags="book-detail", ttl=500)
     */
    public function getProduct($sku, $type = 'book')
    {
        // fetch a product from a repository or whatever
        $product = $this->productRepository->getByType($sku, 'book');

        return $product;
    }
}

@CacheEvict 注解

@CacheEvict 注解允许方法触发缓存填充或缓存删除。

当方法带有@CacheEvict注解时,包将执行方法,然后自动尝试删除带有提供键和标签的缓存条目。

<?php

namespace My\Manager;

use My\Model\Product;

use Phpro\AnnotatedCache\Annotation\CacheEvict;

class ProductManager
{
    /**
     * @CacheEvict(pools="products", key="product.getSku()", tags="book-list")
     */
    public function removeProduct(Product $product)
    {
        // saving product ...
    }
}

@CacheUpdate 注解

@CacheUpdate 注解在需要更新缓存而不干扰方法执行时非常有用。

当一个方法被 @CacheUpdate 注解标记时,组件将始终执行该方法,然后会自动尝试使用方法结果更新缓存条目。

<?php

namespace My\Manager;

use My\Model\Product;

use Phpro\AnnotatedCache\Annotation\CacheUpdate;

class ProductManager
{
    /**
     * @CacheUpdate(pools="products", key="product.getSku()", tags="product-detail", ttl=300)
     */
    public function updateProduct(Product $product)
    {
        // saving product....

        return $product;
    }
}

表达式语言

对于键生成,可以使用 Symfony 表达式语言

/**
 * @CacheUpdate(pools="products", key="product.getSku()")
 */
 public function updateProduct(Product $product)
 {
    // do something
 }

表达式语言允许您检索传递给方法的所有参数,并使用它来生成缓存键。请注意,您还可以访问 InterceptionInterface。这意味着您可以向键中添加其他数据,如 instancemethod。对于 CacheUpdate 和 CacheEvict,您还将能够访问 returnValue。以下是一个小例子

/**
 * @Cacheable(pools="products", key="interception.getMethod() ~ id")
 */
 public function getProduct(int $id)
 {
    // do something
 }

标签

可以为缓存条目添加一个或多个标签。由于这并不是 PSR-6 的默认功能,您需要在您的缓存池中实现 cache/taggable-cache TaggablePoolInterface

处理结果

可以将 ResultCollectorInterface 添加到 CacheHandler 中。这样,您可以向应用程序提供有关注释发生情况的反馈。默认情况下,将使用一个虚拟收集器,它不会收集任何内容。

use Phpro\AnnotatedCache\Factory;
use Phpro\AnnotatedCache\Collector\MemoryResultCollector;

// Instantiate pool

$resultCollector = new MemoryResultCollector();
$cacheHandler = Factory::createCacheHandler($poolManager, $resultCollector);

// Instantiate proxy service ...

$myService->fetchSomethingCached();
$results = $resultCollector->getResults();

结果将是一个 ResultCollection 的实例,它将包含一系列 ResultInterface 对象。可能的结果

  • EmptyResult(这些通过收集器过滤掉)
  • HitResult
  • MissResult
  • EvictResult
  • UpdateResult

编写自己的注解

编写自己的注解并让 CacheHandler 拦截您自己的注解非常简单。您需要做的唯一事情是编写自己的 InterceptorInterface 实现和自定义注解。然后您可以在缓存处理程序上注册此自定义拦截器并执行自己的操作。

$cacheHandler = Factory::createCacheHandler($poolManager);
$cacheHandler->addInterceptor($myCustomInterceptor)

关于

提交错误和功能请求

错误和功能请求在 GitHub 上跟踪。请在 贡献您的代码 之前查看我们的规则。

许可

Annotated-cache 在 MIT 许可证下授权 - 有关详细信息,请参阅 LICENSE 文件。

致谢

此软件包基于 TbbcCacheBundle。它使用完全相同的注解。最大的区别是此软件包可以在任何 PHP 应用程序中使用。

感谢Doctrine、proxy-managerphp-cache 项目提供了这个包所需的工具!