joostvanveen / litespeedcache
一个不依赖于框架的Litespeed缓存库,适用于任何PHP应用。
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ^7.5
README
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非常简单
- 在joostvanveen/litespeedcache中启用ESI
(new \Joostvanveen\Litespeedcache\Cache)->setEsiEnabled(true)->cache() - 在你的域名上创建一个URL,该URL将返回ESI块的内容,例如 'https://mydomain.com/token'。
- 在你的页面中使用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
- www.domain.com/news?page=2
- subdomain.domain.com/news?page=2
这两个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,或者设置一个值为 1 的 cache_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)
贡献
欢迎提交拉取请求。对于重大更改,请先提交一个问题,以便讨论您想要进行哪些更改。
请确保根据需要更新测试。