我正在处理在不同服务器上运行的两个不同的 Symfony 2.8
项目。它想使用压缩来加快加载速度。我找到的所有资源都指向 mod_deflate
。但是,虽然第一台服务器根本不提供 mod_deflate
,但当 FastCGI
启用时,第二台服务器无法使用 mod_deflate
。
我只找到信息,可以在服务器内启用压缩 (mod_deflate
) 或“在脚本中”。但是我没有找到关于这个“脚本中”解决方案的任何详细信息。
是否可以在不使用 mod_deflate
的情况下在 Symfony 中启用压缩?
最佳答案
您可以尝试在 kernel.response
事件中手动 gzip 内容:
namespace AppBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class CompressionListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
KernelEvents::RESPONSE => array(array('onKernelResponse', -256))
);
}
public function onKernelResponse($event)
{
//return;
if ($event->getRequestType() != HttpKernelInterface::MASTER_REQUEST) {
return;
}
$request = $event->getRequest();
$response = $event->getResponse();
$encodings = $request->getEncodings();
if (in_array('gzip', $encodings) && function_exists('gzencode')) {
$content = gzencode($response->getContent());
$response->setContent($content);
$response->headers->set('Content-encoding', 'gzip');
} elseif (in_array('deflate', $encodings) && function_exists('gzdeflate')) {
$content = gzdeflate($response->getContent());
$response->setContent($content);
$response->headers->set('Content-encoding', 'deflate');
}
}
}
并在配置中注册这个监听器:
app.listener.compression:
class: AppBundle\EventListener\CompressionListener
arguments:
tags:
- { name: kernel.event_subscriber }
关于apache - 在没有 mod_deflate 的情况下在 Symfony 2 中使用 gzip/compression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45184718/