pablok/supercache-bundle

Symfony 的 Supercache 扩展包

0.6.0 2018-12-09 15:24 UTC

README

这个扩展包是从 SupercacheBundle 分支出来的,后者看起来已经被遗弃了。

Maintainability Test Coverage

Supercache 扩展包

Symfony 框架的静态页面缓存。

什么是 Supercache?

有些人可能对简单的页面加载时间感到烦恼——就像我一样。有许多解决方案可以解决这个问题——这是一个极端的解决方案。如果你曾经使用过 WordPress,你可能会看到 WP Super Cache 插件。这个扩展包是基于类似的原理构建的(但没有任何关联),就像那个插件一样。

基本上,SupercacheBundle 会缓存整个静态文件的响应并免费提供。这对于有很多静态路由经常访问的页面非常有用。

安装

在开始使用这个扩展包之前,你应该仔细阅读 Symfony 知识库中的 HTTP 缓存章节——它提供了一系列关于缓存的优秀技巧和技巧。

这个扩展包可以像任何其他 Symfony 扩展包一样安装。

  1. 打开命令行,进入你的项目目录,并执行以下命令
    composer require pablok/supercache-bundle
  2. 通过在 app/AppKernel.php 文件中添加以下行来启用扩展包
<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new PabloK\SupercacheBundle\SupercacheBundle(),
        );

        // ...
    }

    // ...
}
  1. 执行以下命令并按照屏幕上的说明操作 app/console supercache:install 目前需要手动安装。你应在根目录下创建 webcache 目录,然后执行以下步骤中的前两个步骤。

配置

TBD 默认配置

supercache:

    # Enable/disable cache while running prod environment
    enabled:              true

    # Cache directory, must be http-accessible (so it cannot be located under app/)
    cache_dir:           '%kernel.root_dir%/../webcache'

    # Enable/disable adding X-Supercache header
    cache_status_header: true

故障排除

安装命令失败: 无法创建缓存目录

看起来指定的缓存目录无法创建。这可能是权限相关的问题。你可以尝试自己创建它。要这样做,只需创建所需的缓存目录(默认设置为 ./webcache/)。接下来,在缓存目录内的 .htaccess 文件中添加以下内容

RemoveHandler .php
RemoveType .php
Options -ExecCGI

<IfModule mod_php5.c>
    php_flag engine off
</IfModule>

<IfModule mod_headers.c>
    Header set Cache-Control 'max-age=3600, must-revalidate'
</IfModule>

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/html A3600
</IfModule>

<IfModule mod_mime.c>
    AddType application/javascript .js
    AddType text/html .html
    AddType application/octet-stream .bin
</IfModule>

安装命令失败: 无法修改 .htaccess (...)

如果你(或某个其他扩展包)修改了 web/.htaccess 文件,安装程序可能无法自动应用所需更改。你可以手动添加以下行——它们应放置在 RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L](或类似)下方

### >>>SUPERCACHE BUNDLE 
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD) [OR]
RewriteCond %{QUERY_STRING} !^$
RewriteRule . - [S=3]

RewriteCond %{DOCUMENT_ROOT}/../webcache/$1/index.html -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/../webcache/$1/index.html [L]

RewriteCond %{DOCUMENT_ROOT}/../webcache/$1/index.js -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/../webcache/$1/index.js [L]

RewriteCond %{DOCUMENT_ROOT}/../webcache/$1/index.bin -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/../webcache/$1/index.bin [L]
### <<<SUPERCACHE BUNDLE

请注意,缓存路径需要调整。路径是相对于 web/ 目录的。

我的服务器不支持 .htaccess

你有两个选择:将上述重写规则转换为服务器支持的格式,或者使用 PHP-PULL 模式。SupercacheBundle 包含针对不支持 .htaccess 的服务器的后备模式(例如,使用 app/console server:run 命令启动的 CLI 服务器)。此模式通过附加到 Symfony HTTP 内核并尝试定位给定请求的缓存响应来工作。当然,这也有代价——后备模式将运行 PHP 解释器和初始化框架的核心。在我的测试中,DIRECT 模式返回响应需要 3-5 毫秒,而 PHP-PULL 模式需要大约 30 毫秒。

无需更改任何配置选项即可启用 PHP-PULL。

常见问题解答

所有响应都会被缓存吗?

不,请求和响应必须满足某些标准才能被缓存

  • GET 请求方法
  • 没有查询字符串
  • 响应代码在200到300之间(不包括204)
  • 没有 privateno-store 缓存控制指令
  • 路由没有被标记为排除(详细信息请见#3)

有任何限制吗?

是的,有一些限制

  • /sandbox/sandbox/ 上无法提供不同的内容
  • 不允许有路由 ...(它们在HTTP RFC中本身就是非法的)
  • 没有自动检查认证令牌(如果你展示用户特定信息,则需要你自己设置 private 缓存策略)
  • 由于性能原因,文件以以下MIME类型之一从缓存中提供:text/html, application/javascript 或 application/octet-stream。有关详细信息,请参阅 问题#2