2017-07-19 71 views
1

我正在处理运行在不同服务器上的两个不同Symfony 2.8项目。它希望使用压缩来加快载入速度。我找到的所有资源都指向mod_deflate。但是,虽然第一台服务器完全不提供mod_deflate,但第二台服务器不能使用mod_deflate,而FastCGI已启用。在没有mod_deflate的情况下在Symfony 2中使用gzip/compression

我只找到信息,可以在服务器(mod_deflate)或“在脚本中”启用压缩。但是我没有在这个“脚本”解决方案中找到任何细节。

以某种方式可以在不使用mod_deflate的情况下在Symfony中启用压缩吗?

回答

2

你可以尝试在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 } 
+0

非常感谢你,这听起来非常有前途的!与'mod_deflate'压缩相比,是否有任何性能下降?当然,使用'Apache'或'Symfony'执行'gzip'没有什么区别,但是缓存怎么办? –

+0

我不能说性能。尝试对apache gzip和自定义gzip进行测试。你可以通过apache'ab'程序来完成。我认为浏览器缓存对两个版本的作用都是一样的。 –

相关问题