pablok / supercache-bundle
Symfony 的 Supercache 扩展包
Requires
- php: ^7.1.3
- symfony/config: ~2.8|~3.4|~4.1
- symfony/console: ~2.8|~3.4|~4.1
- symfony/dependency-injection: ~2.8|~3.4|~4.1
- symfony/filesystem: ~2.8|~3.4|~4.1
- symfony/framework-bundle: ~2.8.18|~3.4|~4.1
- symfony/http-foundation: ~2.8|~3.4|~4.1
- symfony/http-kernel: ~2.8|~3.4|~4.1
- symfony/routing: ~2.8|~3.4|~4.1
- voku/html-min: ^3.0.1
- voku/simple_html_dom: ^4.0.1
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.2
- pds/skeleton: ~1.0
- phpunit/phpunit: ~7.4.0
- symfony/browser-kit: ~2.8|~3.4|~4.1
- symfony/css-selector: ~2.8|~3.4|~4.1
- symfony/debug: ~2.8|~3.4|~4.1
- symfony/dom-crawler: ~2.8|~3.4|~4.1
- symfony/finder: ~2.8|~3.4|~4.1
- symfony/phpunit-bridge: ^4.2
- symfony/yaml: ~2.8|~3.4|~4.1
README
这个扩展包是从 SupercacheBundle 分支出来的,后者看起来已经被遗弃了。
Supercache 扩展包
Symfony 框架的静态页面缓存。
什么是 Supercache?
有些人可能对简单的页面加载时间感到烦恼——就像我一样。有许多解决方案可以解决这个问题——这是一个极端的解决方案。如果你曾经使用过 WordPress,你可能会看到 WP Super Cache
插件。这个扩展包是基于类似的原理构建的(但没有任何关联),就像那个插件一样。
基本上,SupercacheBundle 会缓存整个静态文件的响应并免费提供。这对于有很多静态路由经常访问的页面非常有用。
安装
在开始使用这个扩展包之前,你应该仔细阅读 Symfony 知识库中的 HTTP 缓存章节——它提供了一系列关于缓存的优秀技巧和技巧。
这个扩展包可以像任何其他 Symfony 扩展包一样安装。
- 打开命令行,进入你的项目目录,并执行以下命令
composer require pablok/supercache-bundle
- 通过在
app/AppKernel.php
文件中添加以下行来启用扩展包
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new PabloK\SupercacheBundle\SupercacheBundle(), ); // ... } // ... }
执行以下命令并按照屏幕上的说明操作目前需要手动安装。你应在根目录下创建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)
- 没有
private
或no-store
缓存控制指令 - 路由没有被标记为排除(详细信息请见#3)
有任何限制吗?
是的,有一些限制
- 在
/sandbox
和/sandbox/
上无法提供不同的内容 - 不允许有路由
..
和.
(它们在HTTP RFC中本身就是非法的) - 没有自动检查认证令牌(如果你展示用户特定信息,则需要你自己设置
private
缓存策略) - 由于性能原因,文件以以下MIME类型之一从缓存中提供:text/html, application/javascript 或 application/octet-stream。有关详细信息,请参阅 问题#2。