2017-07-19 82 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'程序來完成。我認爲瀏覽器緩存對兩個版本的作用都是一樣的。 –

相關問題