joostvanveen/litespeedcache

一个不依赖于框架的Litespeed缓存库,适用于任何PHP应用。

v1.4.0 2019-05-13 21:22 UTC

This package is auto-updated.

Last update: 2024-09-14 10:13:02 UTC


README

coverage

joostvanveen/litespeedcache

一个不依赖于框架的Litespeed缓存库,适用于任何PHP应用。

如果您在寻找Laravel实现版本,请参阅 https://github.com/joostvanveen/laravel-litespeedcache

安装

使用composer安装包

composer require joostvanveen/litespeedcache

在您的 .htaccess 文件中启用Litespeed。

<IfModule LiteSpeed>
    # Enable public cache
    CacheEnable public /
    
    # Enable private cache if you need to
    CacheEnable private /
    
    # Check the public cache
    CacheLookup public on
    
    # Ignore normal Cache Control headers
    CacheIgnoreCacheControl On
    
    # Maximum expiration time in seconds
    CacheMaxExpire 604800
</IfModule>

用法

该包不缓存

  • 除了GET和HEAD之外的任何请求
  • 任何ajax请求
  • 任何CLI请求

缓存还可以

  • 启用或禁用
  • 包含一个或多个标签
  • 包含vary头部
  • 包含一个不应缓存的黑名单URI数组
  • 包含一个不应缓存的黑名单查询字符串数组

默认配置值

  • type = public
  • enabled = true (缓存已启用)
  • lifetime = 120 (2小时)
  • bypass cookiename = cache_bypass (参见绕过缓存)
  • bypass querystring = cache_bypass (参见绕过缓存)

缓存当前URL

use Joostvanveen\Litespeedcache\Cache;

[...]

// Cache the current URL as public with a cache lifetime of 120 minutes
$cache = new Cache;
$cache->cache(); // use default type and lifetime

// You can also use new Cache directly, like so:
(new Cache)->cache(); // use default type and lifetime
(new Cache)->cache('private', 360); // use explicit type and lifetime

// You can also use the setType() and setLifetime() methods
(new Cache)->setEnabled(true)->setType('private')->setLifetime(3600)->cache();

// If the lifetime is set to 0 the page will not be cached
(new Cache)->setEnabled(true)->setLifetime(0)->cache();

缓存特定URL

这可以用于预热缓存,例如。

// Warm the cache for these URIs
$uris = [
    '/',
    '/about-us',
    '/contact',
];

$cache = (new \Joostvanveen\Litespeedcache\Cache);
foreach($uris as $uri) {
    $cache->cache('public', 120, $uri);
}

排除URI从缓存

URI是请求路径,不包括查询字符串。在 https://example.com/foo?bar=baz 中,URI是 /foo

如果URL与已排除的任何URI匹配,则不会缓存。排除的URI可以包含通配符。

在以下示例中,URI '/checkout/step/1' 不会缓存。

$excludedUris = [
    'checkout*',
    'admin*',
];
(new \Joostvanveen\Litespeedcache\Cache)->setExcludedUrls($excludedUris)->cache('public', 120);

缓存ajax请求

默认情况下,ajax请求不会缓存。但您可以按照以下方式设置

(new Cache)->setEnableAjaxCache(true)->cache();

缓存HTTP请求方法

默认情况下,只有GET和HEAD请求会缓存。但您可以按照以下方式设置

$requestTypes = ['GET', 'HEAD', 'POST', 'PUT'];
(new Cache)->setCacheableHttpVerbs($requestTypes)->cache();

排除查询字符串从缓存

查询字符串是添加到URL后问号后的参数。在 https://example.com/foo?bar=baz 中,查询字符串是 bar=baz

如果URL的查询字符串与已排除的任何URI匹配,则不会缓存。排除的查询字符串可以包含通配符。

在以下示例中,URL https://example.com/search?query=foo&page=1&direction=desc 不会缓存。

$excludedQueryStrings = [
    '*direction=*',
];
(new \Joostvanveen\Litespeedcache\Cache)->setExcludedQueryStrings($excludedQueryStrings)->cache('public', 120);

向缓存添加标签

您可以为缓存的当前URL添加一个或多个标签。您可以使用这些标签一次性清除包含这些标签的所有缓存。

默认情况下,addTags()接受一个标签数组。

(new \Joostvanveen\Litespeedcache\Cache)->addTags(['articles', 'english'])
                                        ->addTags(['page1'])
                                        ->cache('public', 120);

向缓存添加ESI

有时,您不想缓存页面上的所有内容。例如,如果您有一个包含csrf令牌的表单,您不想缓存csrf令牌。它必须对所有用户都是唯一的。您可以通过使用边侧包含(Edge Side Includes,或ESI块)来实现这一点。这些ESI块就像在你的缓存页面中打孔一样。

ESI块是一种特殊的HTML标签,它不会被缓存。相反,在构建缓存页面时,Litespeed缓存会使用从同一域名上的另一个(未缓存或私有缓存)URL检索到的内容替换ESI标签。通常,这样的URL会返回一个字符串或HTML块,例如csrf令牌、登录用户的名称,或者包含购物车内容的复杂HTML字符串。

使用ESI非常简单

  1. 在joostvanveen/litespeedcache中启用ESI (new \Joostvanveen\Litespeedcache\Cache)->setEsiEnabled(true)->cache()
  2. 在你的域名上创建一个URL,该URL将返回ESI块的内容,例如 'https://mydomain.com/token'。
  3. 在你的页面中使用ESI标记块,其中包含ESI URL: <esi:include src="https://mydomain.com/token" />

ESI示例
假设你有一个包含csrf令牌的表单,获取未缓存令牌的URL为 https://mydomain.com/token

没有ESI的情况下,你会在表单中这样显示令牌

<input type="hidden" name="_token" value="{{ csrf_token() }}">

使用ESI的情况下,你首先创建一个返回 <input type="hidden" name="_token" value="{{ csrf_token() }}"> 的URL,然后在页面中插入一个将被该URL内容替换的ESI块。

<esi:include src="https://mydomain.com/get-my-token" />

当然,你也可以让URL只返回令牌,并将ESI块放在表单中,如下所示

<input type="hidden" name="_token" value="<esi:include src="https://mydomain.com/get-my-token" />">

一句忠告:尽量少使用ESI块。构建包含大量ESI块的缓存页面会消耗大量时间和资源,从而抵消缓存的所有优势。只包含少量ESI块的页面可能会稍微慢一些,但性能仍然良好。使用ESI块时,测量缓存页面和未缓存页面的响应时间差异。

向缓存添加vary

有时,你希望缓存能够区分相同URL的不同变体。

示例:假设你有一个多站应用,它在不同的子域名上运行。假设你提供以下两个URL

这两个URL有不同的内容,所以你需要Litespeed为每个URL存储一个缓存。默认情况下,Litespeed缓存无法做到这一点。它只取 news?page=1 部分来创建缓存标识符,这将适用于两个URL。

但是,当你将子域名添加为 VARY 时,Litespeed缓存将 确实 将其添加到缓存标识符中,为每个域名存储不同的版本。

请注意不要使用过多的vary值,否则标识符将变得过于定制化,以至于你的应用程序中不会有任何两个缓存标识符相同。例如,如果你将用户代理添加到vary中,就可能会发生这种情况。

(new \Joostvanveen\Litespeedcache\Cache)->addVary('value=subdomain')->cache('public', 360);                            

你也可以传递一个字符串,如果你只需要定义一个标签。

(new \Joostvanveen\Litespeedcache\Cache)->addTags('articles')->cache('public', 120);

从缓存中清除选定的URI

要清除特定URI,只需在调用purge()之前将URI添加到缓存中即可。

(new \Joostvanveen\Litespeedcache\Cache)->addUri('/about-us')
                                        ->purge();

从缓存中清除选定的标签

要清除标签,只需在调用purge()之前将标签或标签添加到缓存中即可。

(new \Joostvanveen\Litespeedcache\Cache)->addTags(['articles', 'english'])
                                        ->purge();

还有一个特殊的方法可以只清除标签:purgeTags()。默认情况下,purgeTags()接受一个标签数组。

(new \Joostvanveen\Litespeedcache\Cache)->purgeTags(['articles', 'english']);

你也可以传递一个字符串,如果你只需要定义一个标签。

(new \Joostvanveen\Litespeedcache\Cache)->purgeTags('english');

刷新整个缓存

你可以一次性清除缓存中的所有项目,如下所示

(new \Joostvanveen\Litespeedcache\Cache)->purgeAll();

绕过缓存

有时,你需要检查没有缓存的URL,例如用于故障排除或预览。为此,你可以在查询字符串中添加 cache_bypass=1,或者设置一个值为 1cache_bypass cookie。

例如,此URL绕过了缓存:https://example.com?cache_bypass=1

禁用缓存

默认情况下,缓存是启用的。但您也可以禁用它。

$cache = new \Joostvanveen\Litespeedcache\Cache; 

$cache->disable();
$enabled = $cache->enabled(); // Returns false

$cache->enable();
$enabled = $cache->enabled(); // Returns true

在Laravel项目中使用Litespeed Cache

在Laravel项目中,包会自动注册。您还可以使用Litespeedcache外观。

而不是调用类似

(new \Joostvanveen\Litespeedcache\Cache)->cache('public', 120);

您可以直接调用

use LitespeedCache;

[...]

LitespeedCache::cache('public', 120);

在Laravel中使用缓存时,最好根据环境进行检查。因为缓存会设置头部信息,这可能会破坏您的测试(phpunit在设置头部信息之前发送输出,这会导致headers already sent错误。)

if(! \App::environment(‘testing’) {
    Cache::purge();
}

Litespeed文档

您可以在以下位置找到Litespeed缓存文档:[Litespeed文档:https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:cache:developer_guide:response_headers](Litespeed文档:https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:cache:developer_guide:response_headers)

贡献

欢迎提交拉取请求。对于重大更改,请先提交一个问题,以便讨论您想要进行哪些更改。

请确保根据需要更新测试。

变更日志

变更日志

许可证

MIT