在没有 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 }