Symfony & vagrant – większa prędkość

by Yaroslav Shypunov
5 miesięcy ago
485 Views

Symfony Framework to jeden z najpopularniejszych frameworków PHP dostępnych na rynku. Vagrant to z kolei aplikacja, która pozwala na utworzenie środowiska deweloperskiego jak najbardziej zbliżonego do środowisk testowego i produkcyjnego. W IdeaSpot korzystamy z obydwu tych technologii razem. Niestety, przy domyślnej konfiguracji, korzystanie z Symfony na vagrancie jest zaskakująco nieefektywne, z czasami przeładowania strony rzędu 50-60 sekund! W tym artykule przedstawiamy kilka trików, które pozwolą zmniejszyć czas przeładowywania strony do 1-2 sekund.

Założenia

  • Nasz komputer „host” to laptop z zainstalowanym Windowsem 10.
  • Nasz komputer „guest” (maszyna wirtualna) to Centos 7.
  • Korzystamy z darmowego Oracle VirtualBox.
  • Katalog z Symfony podmontowany jest do /vagrant/code.
  • Z aplikacją opartej Symfony łączymy się z maszyny „host” poprzez URL: https://127.0.0.1:8443/vagarant/code/web/app_dev.php

Odblokowujemy dostęp do app_dev.php z maszyny „host”

Domyślnie środowisko deweloperskie Symfony dostępne jest wyłącznie z localhost. Ponieważ Symfony uruchamiamy z maszyny wirtualnej, a dostęp próbujemy uzyskać z maszyny hosta, konieczne jest odblokowanie dostępu dla IP hosta.

W tym celu edytujemy plik: /vagrant/code/web/app_dev.php i dopisujemy IP naszego hosta (zaznaczone na czerwono):

if (isset($_SERVER['HTTP_CLIENT_IP'])
    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
    || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '10.0.2.2', '::1']) || php_sapi_name() === 'cli-server')
) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

Zazwyczaj kusząca jest opcja wykomentowania (lub usunięcia) całego powyższego warunku, nie jest to jednak prawidłowe podejście, ponieważ z dużym prawdopodobieństwem w pewnym momencie tak „odbezpieczony” kod trafi na serwery produkcyjne.

Po zapisaniu zmian w pliku app_dev.php, dostęp do Symfony z poziomu przeglądarki na komputerze hosta będzie dostępny.

Przenosimy cache i logi na dysk wirtualny

Symfony dla zwiększenia wydajności korzysta z cache. Domyślnie zarówno pliki cache jak i logi aplikacji znajdują się w folderze projektu (w przypadku Symfony 2.x w app/cache i app/log, w Symfony 3.x w var/cache i var/log). W naszej konfiguracji, folder projektu znajduje się tak naprawdę na dysku twardym maszyny hosta, a dla maszyny wirtualnej udostępniany jest jako dysk sieciowy. Przy generowaniu każdej strony, Symfony wykonuje mnóstwo zapisów/odczytów z cache i logów. Ponieważ dla maszyny wirtualnej są to tak naprawdę zapisy do dysku sieciowego, a nie lokalnego, ich wydajność jest bardzo słaba. Przeniesienie logów środowiska deweloperskiego i testowego na dysk twardy maszyny wirtualnej pozwala wielokrotnie przyspieszyć działanie aplikacji.

W celu zmiany miejsca, gdzie Symfony przechowuje logi i cache, należy zmodyfikować plik app/AppKernel.php.

Cache

Znajdujemy w pliku app/AppKernel.php funkcję getCacheDir(). Jej domyślna postać jest następująca (Symfony 3.x):

public function getCacheDir()
{
    return dirname(__DIR__).'/var/cache/'.$this->getEnvironment();
}

W przypadku Symfony 2.x, funkcja ta może nie występować w AppKernel.php w ogóle.

Modyfikujemy / dodajemy funkcję w następujący sposób (czerwony fragment):

public function getCacheDir()
{
    if (in_array($this->environment, array('dev', 'test'))  && __DIR__ === "/vagrant/code/app" ) {
        return '/dev/shm/myapp/cache/' . $this->environment;
    }
    return dirname(__DIR__).'/var/cache/'.$this->getEnvironment();
}

Powyższy kod oznacza, że w przypadku środowiska deweloperskiego (app_dev.php i konsola) oraz w przypadku środowiska testowego (phpunit), jeśli aplikacja znajduje się w katalogu /vagrant/code (dzieje się tak wyłącznie gdy aplikacja jest posadowiona na vagrancie), Symfony zapisywać będzie cache do /dev/shm/myapp/cache/dev lub /dev/shm/myapp/cache/test.

Logi

Znajdujemy w pliku app/AppKernel.php funkcję getLogDir(). Jej domyślna postać jest następująca (Symfony 3.x):

public function getLogDir()
{
    return dirname(__DIR__).'/var/logs';
}

W przypadku Symfony 2.x, funkcja ta może nie występować w AppKernel.php w ogóle.

Modyfikujemy / dodajemy funkcję w następujący sposób (czerwony fragment):

public function getLogDir()
{
    if (in_array($this->environment, array('dev', 'test') )&& __DIR__ === "/vagrant/code/app") {
        return '/dev/shm/myapp/logs';
    }

    return dirname(__DIR__).'/var/logs';
}

Powyższy kod oznacza, że podobnie jak z cache, w przypadku środowiska deweloperskiego (app_dev.php i konsola) oraz w przypadku środowiska testowego (phpunit), jeśli aplikacja znajduje się w katalogu /vagrant/code, Symfony zapisywać będzie logi do /dev/shm/myapp/logs.

 

Tagi: , ,

Dodaj komentarz