adriansuter/twig-cache-busting

Twig Cache Busting是Twig的一个插件,用于支持模板编译时的缓存破坏。

3.0 2023-01-18 07:20 UTC

This package is auto-updated.

Last update: 2024-09-18 10:59:57 UTC


README

Build Status Coverage Status Total Downloads License

Twig Cache Busting是Twig的一个插件,用于在模板编译时支持缓存破坏。

安装

$ composer require adriansuter/twig-cache-busting

描述

此插件通过缓存破坏机制扩展Twig。缓存破坏发生在模板的编译过程中(而不是在渲染时)。因此,每当您更新一个资产时,您需要重新编译引用此资产的模板(或清除缓存并让Twig自动重建它)。好处是,如果您缓存了编译后的模板,则服务器只需在第一次(而不是每次请求)处理性能密集型的缓存破坏。

缓存破坏方法

默认情况下,有三种缓存破坏方法。但您可以通过实现\AdrianSuter\TwigCacheBusting\Interfaces\CacheBusterInterface来开发自己的自定义缓存破坏器。

  • 查询参数缓存破坏此缓存破坏器会将查询参数追加到文件路径。例如,路径为image.jpg的资产被转换为image.jpg?c=abcd
  • 文件名缓存破坏此缓存破坏器会更改文件名。例如,路径为image.jpg的资产被转换为image.abcd.jpg
  • 字典缓存破坏此缓存破坏器使用查找表(映射)来查找目标文件路径。

哈希生成器

查询参数缓存破坏文件名缓存破坏都使用哈希生成器为给定资产生成哈希值(在上面的例子中,哈希值为abcd)。默认情况下,以下哈希生成器是可能的。但您可以通过实现\AdrianSuter\TwigCacheBusting\Interfaces\HashGeneratorInterface来开发自己的自定义哈希生成器。

  • 文件MD5哈希生成器此哈希生成器计算文件的MD5哈希值。
  • 文件SHA1哈希生成器此哈希生成器计算文件的SHA1哈希值。
  • 文件修改时间哈希生成器此哈希生成器使用文件的修改时间作为Unix时间戳。

用法

查询参数缓存破坏

假设您有一个文件/home/htdocs/public/assets/image.jpg,您的模板如下所示

<img src="{% cache_busting 'assets/image.jpg' %}">

要使用查询参数缓存破坏,您需要将QueryParamCacheBuster传递给CacheBustingTwigExtension的静态create方法。

use AdrianSuter\TwigCacheBusting\CacheBusters\QueryParamCacheBuster;
use AdrianSuter\TwigCacheBusting\CacheBustingTwigExtension;

//...

$twig->addExtension(
    CacheBustingTwigExtension::create(
        new QueryParamCacheBuster('/home/htdocs/public')
    )
);

默认情况下,QueryParamCacheBuster使用FileModificationTimeHashGenerator。但您可以通过构造函数传递第二个参数来设置另一个生成器。例如

use AdrianSuter\TwigCacheBusting\HashGenerators\FileMD5HashGenerator;

new QueryParamCacheBuster('/home/htdocs/public', new FileMD5HashGenerator())

文件名缓存破坏

假设您有一个文件/home/htdocs/public/assets/image.jpg,您的模板如下所示

<img src="{% cache_busting 'assets/image.jpg' %}">

要使用文件名缓存破坏,您需要将FileNameCacheBuster传递给CacheBustingTwigExtension的静态create方法。

use AdrianSuter\TwigCacheBusting\CacheBusters\FileNameCacheBuster;
use AdrianSuter\TwigCacheBusting\CacheBustingTwigExtension;

// ...

$twig->addExtension(
    CacheBustingTwigExtension::create(
        new FileNameCacheBuster('/home/htdocs/public')
    )
);

您的Web服务器需要配置为将缓存破坏请求重定向。对于Apache,您需要设置

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(js|css|jpg|png|svg)$ $1.$3 [L]

注意,您可能需要在重写规则中添加更多扩展。

默认情况下,FileNameCacheBuster使用FileModificationTimeHashGenerator。但您可以通过将第二个参数传递给构造函数来设置另一个生成器。例如

use AdrianSuter\TwigCacheBusting\HashGenerators\FileMD5HashGenerator;

new FileNameCacheBuster('/home/htdocs/public', new FileMD5HashGenerator())

如果您的哈希生成器返回十六进制哈希值,那么您需要相应地修改Apache的重写规则。例如

RewriteRule ^(.+)\.([a-f0-9]+)\.(js|css|jpg|png)$ $1.$3 [L]

字典缓存破坏器

此缓存破坏方法将使用字典来查找文件名。字典基本上是原始文件路径和缓存破坏版本之间的映射。

use AdrianSuter\TwigCacheBusting\CacheBusters\DictionaryCacheBuster;
use AdrianSuter\TwigCacheBusting\CacheBustingTwigExtension;
use AdrianSuter\TwigCacheBusting\Dictionaries\ArrayDictionary;

// ...

$twig->addExtension(
    CacheBustingTwigExtension::create(
		new DictionaryCacheBuster(
			new ArrayDictionary([
				'assets/image.jpg' => 'assets/cb-1c2d7c4s36d47d.jpg',
			])
		)
	)
);

基本路径

如果您想将基本路径添加到生成的路径中,只需将该路径传递给CacheBustingTwigExtension的静态create方法即可。例如

$twig->addExtension(
    CacheBustingTwigExtension::create(
        new QueryParamCacheBuster('/home/htdocs/public'),
        'base-path'
    )
);

自定义Twig标签

如果您想将twig标签cache_busting更改为其他内容,您可以通过设置CacheBustingTwigExtension的静态create方法的第三个参数来实现。例如

$twig->addExtension(
    CacheBustingTwigExtension::create(
        new QueryParamCacheBuster('/home/htdocs/public'),
        null,
        'cb'
    )
);

现在您可以在模板中使用cb来应用缓存破坏。

<img src="{% cb 'assets/image.jpg' %}">

贡献

非常欢迎。