noflash / supercache-bundle
用于 Symfony 的 Supercache 扩展包
Requires
- php: >=5.3.2
- symfony/console: ~2.3|~3.0
- symfony/framework-bundle: ~2.3|~3.0
This package is auto-updated.
Last update: 2021-03-04 04:30:25 UTC
README
该项目源于多年前加快页面渲染速度的需求。现在,我们拥有更好的技术(CDN、HTTP/2、SPA)来处理这个问题。代码应该与 Symfony 2 & 3 兼容,但需要升级以支持 Symfony 的新版本。
该项目保留在此,以供仍在使用它的遗留应用程序以及作为历史资料。
Supercache 扩展包
Symfony 框架的静态页面缓存。
什么是 Supercache?
有些人可能对简单页面的加载时间感到烦恼——这正好像我一样。针对这个问题有很多解决方案——这是一个极端的方案。如果你曾经使用过 WordPress,你可能见过 WP Super Cache
插件。这个扩展包基于类似的原则构建(但与该插件没有关联)。
基本上,SupercacheBundle 缓存整个对静态文件的响应,并以零成本提供服务。这对于有很多静态路由经常访问的页面非常有用。
安装
在您开始使用此扩展包之前,您应该仔细阅读 Symfony 烹饪书中的 HTTP 缓存章节——它提供了一堆关于缓存的优秀技术和技巧。
扩展包可以像其他任何 Symfony 扩展包一样安装。
- 打开命令行,进入您的项目目录,并执行以下命令
composer require noflash/supercache-bundle
- 通过向
app/AppKernel.php
文件中添加以下行来启用扩展包
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new noFlash\SupercacheBundle\SupercacheBundle(), ); // ... } // ... }
执行以下命令并遵循屏幕上的说明目前需要手动安装。您应该在根目录中创建app/console supercache:install
webcache
目录,然后执行以下部分中描述的故障排除部分的前两个步骤。
配置
待定 默认配置
supercache: # Enable/disable cache while running prod environment enable_prod: true # Enable/disable cache while running dev environment enable_dev: false # 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 不需要更改任何配置选项。
常见问题解答(FAQ)
所有的响应都会被缓存吗?
不,请求和响应必须满足某些条件才能被缓存
GET
请求方法- 没有查询字符串
- 响应代码在 200 到 300 之间(不包括 204)
- 没有
private
或no-store
缓存控制指令 - 路由没有被标记为排除(详细信息请见 #3)
有什么限制吗?
是的,有一些限制
- 无法在
/sandbox
和/sandbox/
上提供不同的内容 - 您不能有
..
和.
的路由(它们在 HTTP RFC 中本来就是非法的) - 没有自动检查身份验证令牌(如果您展示的是用户特定的信息,那么设置
private
缓存策略是您的责任) - 由于性能原因,文件以以下 MIME-Types 之一从缓存中提供:text/html、application/javascript 或 application/octet-stream。有关详细信息,请参阅 问题 #2。