bkwld / freezer
使用Laravel,创建全页缓存版本,可以直接由Apache提供服务
Requires
- php: >=5.3.0
- illuminate/http: >=4.1.18
- illuminate/support: <4.2,>=4.0
Requires (Dev)
- mockery/mockery: ~0.8
- phpunit/phpunit: ~3.7
README
Freezer创建可以由Apache直接提供的全页缓存。换句话说,一旦创建缓存,PHP甚至不会加载来返回该缓存。因此,您不仅消除了整个Laravel堆栈启动的开销,还消除了应用程序代码、数据库查询等成本。
Freezer通过创建Apache可以通过特殊htaccess规则直接找到的缓存文件来实现这一点。过时缓存的修剪可以通过执行CLI命令(如cron)或通过调用Freezer的API来完成。
Freezer设计的使用场景是小型网站,这些网站在CMS中看不到很多更新。Apache提供静态HTML文件可以加快页面渲染速度,从300ms加快到3ms。
安装
-
将其添加到composer.json("bkwld/freezer": "~1.0")中,并执行composer install。
-
将服务提供者添加到app.php配置文件的providers中:
'Bkwld\Freezer\ServiceProvider',
-
将外观添加到app.php配置文件的aliases中:
'Freezer' => 'Bkwld\Freezer\Facade',
-
在涉及index.php的Laravel规则之前将此添加到public/.htaccess文件中
# Serve Freezer full page cache files RewriteCond %{HTTP_COOKIE} !freezer-skip [NC] RewriteCond %{REQUEST_METHOD} GET RewriteCond %{DOCUMENT_ROOT}/uploads/freezer/$0\.html -f RewriteRule ^.+$ uploads/freezer/$0.html [L] RewriteCond %{HTTP_COOKIE} !freezer-skip [NC] RewriteCond %{REQUEST_METHOD} GET RewriteCond %{DOCUMENT_ROOT}/uploads/freezer/_homepage\.html -f RewriteRule ^$ uploads/freezer/_homepage.html [L]
-
使用
php artisan config:publish bkwld/freezer
将配置文件推送到app/config/packages目录以进行自定义 -
如果您打算使用过期时间,请设置一个工作器或cron作业来运行
php artisan freezer:prune
以删除过时缓存。以下是一个cron示例,它将每分钟检查一次过时缓存* * * * * /path/to/php /path/to/artisan freezer:prune
配置
-
dir
- 您希望Freezer将缓存文件写入到的目录。它必须是可写的,并且位于文档根目录中。换句话说,在您的/public目录中。 -
whitelist
- 匹配应缓存的URL的正则表达式模式的列表。例如,如果您想同时缓存/news和/news/15,则数组中应有条目news(/\d+)?
。自动添加^和$到模式以匹配整个URL路径。如果数组中的条目只是一个模式,则缓存永远不会过期。如果您使用模式-生命周期的键值对(其中生命周期以分钟为单位),则Freezer可以自动过期您的缓存(只要您设置了自动修剪的cron)。例如,'news*' => 15
将在15分钟后过期所有新闻缓存。 -
blacklist
- 在白名单之后处理黑名单。输入不应缓存的模式的列表。例如,如果news/20在黑名单中,而news*在白名单中,则除了id为20的新闻文章外,所有新闻文章都将进行全页缓存。
注意:包中包含一个local/config.php文件,该文件通过具有空的白名单来在本地禁用Freezer(用于您的“本地”环境)。
API
Freezer::clear($pattern, $lifetime)
删除匹配模式或年龄的缓存文件
$pattern
[string, optional] 匹配已缓存的请求路径的正则表达式$lifetime
[number, optional] 只有当缓存创建时间小于此生命周期时才清除
Freezer::rebuild($pattern, $lifetime)
重建匹配模式或年龄的缓存文件。这是通过模拟对同一路由的GET请求并替换缓存为响应来完成的。
$pattern
[string, optional] 匹配已缓存的请求路径的正则表达式$lifetime
[number, optional] 只有当缓存创建时间小于此生命周期时才清除
Freezer::debounce($operation, $pattern, $lifetime)
这是调用clear
或rebuild
的另一种方法,它将调用放入队列中,在Laravel请求结束时进行处理。添加到队列时,队列会进行去重。因此,您可以多次调用(例如)Freezer::rebuild()
,但只重新构建一次缓存。
$operation
[字符串] 'clear'或'rebuild'中的一个$pattern
[string, optional] 匹配已缓存的请求路径的正则表达式$lifetime
[number, optional] 只有当缓存创建时间小于此生命周期时才清除
Freezer::skipNext()
向响应中添加一个cookie,告诉Apache不要使用缓存来响应下一个请求。Freezer随后删除此cookie,这意味着只有下一个请求将被跳过。
命令
注意:您可能需要为每个环境设置明确的app/config/app.php url
属性,以便任何在缓存的页面中渲染的URL都知道站点的域名。
php artisan freezer:clear
删除所有缓存文件
php artisan freezer:prune
根据您的配置文件规则删除已过期的缓存文件。
用法
如引言中所述,该包主要针对那些更新不频繁的站点设计。换句话说,不是基于用户生成内容的站点。让Freezer快速运行的一个简单方法是将以下代码放入您的app/start/global.php文件中
// Delete all Freezer caches when a model changes
// - $m is the model instance that is being acted upon
Event::listen('eloquent.saved*', function($m) { Freezer::debounce('rebuild'); });
Event::listen('eloquent.deleted*', function($m) { Freezer::debounce('rebuild'); });
此代码片段将在您从数据库中创建、更新或删除行时丢弃所有缓存。结合对除了您的admin目录之外的所有内容的白名单(admin*
为黑名单),您就有了一个系统,其中所有面向前端的页面都会被缓存,但仍然可以立即看到在管理区所做的任何更改。您甚至不需要使用这种方法设置cron作业。
在您的app/start/global.php中,还有另一个方便的功能
// Skip caching the next page after any non-GET. For instance, don't cache
// the page that is shown after submitting a form
if (Request::getMethod() != 'GET') Freezer::skipNext();
这将跳过所有跟随POST、PUT或DELETE请求的缓存或服务。
记住在部署新代码时在服务器上清除Freezer缓存(php artisan freezer:clear
)。