bkwld/freezer

使用Laravel,创建全页缓存版本,可以直接由Apache提供服务

1.4.3 2014-03-07 21:19 UTC

This package is auto-updated.

Last update: 2024-09-21 19:41:56 UTC


README

Freezer创建可以由Apache直接提供的全页缓存。换句话说,一旦创建缓存,PHP甚至不会加载来返回该缓存。因此,您不仅消除了整个Laravel堆栈启动的开销,还消除了应用程序代码、数据库查询等成本。

Freezer通过创建Apache可以通过特殊htaccess规则直接找到的缓存文件来实现这一点。过时缓存的修剪可以通过执行CLI命令(如cron)或通过调用Freezer的API来完成。

Freezer设计的使用场景是小型网站,这些网站在CMS中看不到很多更新。Apache提供静态HTML文件可以加快页面渲染速度,从300ms加快到3ms。

安装

  1. 将其添加到composer.json("bkwld/freezer": "~1.0")中,并执行composer install。

  2. 将服务提供者添加到app.php配置文件的providers中:'Bkwld\Freezer\ServiceProvider',

  3. 将外观添加到app.php配置文件的aliases中:'Freezer' => 'Bkwld\Freezer\Facade',

  4. 在涉及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]
    
  5. 使用php artisan config:publish bkwld/freezer将配置文件推送到app/config/packages目录以进行自定义

  6. 如果您打算使用过期时间,请设置一个工作器或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)

这是调用clearrebuild的另一种方法,它将调用放入队列中,在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)。