在没有 mod_deflate 的情况下在 Symfony 2 中使用 gzip / 压缩
Using gzip / compression in Symfony 2 without mod_deflate
我正在不同的服务器上处理两个不同的 Symfony 2.8
项目 运行。它想使用压缩来加快加载速度。我找到的所有资源都指向 mod_deflate
。但是,虽然第一台服务器根本不提供 mod_deflate
,但第二台服务器在启用 FastCGI
时无法使用 mod_deflate
。
我只找到资料,可以在服务器内启用压缩(mod_deflate
)或"in script"。但是我没有找到关于这个 "in script" 解决方案的任何详细信息。
是否可以在不使用 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 }
我正在不同的服务器上处理两个不同的 Symfony 2.8
项目 运行。它想使用压缩来加快加载速度。我找到的所有资源都指向 mod_deflate
。但是,虽然第一台服务器根本不提供 mod_deflate
,但第二台服务器在启用 FastCGI
时无法使用 mod_deflate
。
我只找到资料,可以在服务器内启用压缩(mod_deflate
)或"in script"。但是我没有找到关于这个 "in script" 解决方案的任何详细信息。
是否可以在不使用 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 }