Z reguły przy profilowaniu aplikacji symfony 1.x wychodzi, że budowanie obiektów przez Doctrine jest jedną z bardziej pracochłonnych operacji. Ostatnio miałem ciekawszy przypadek. Znaczącą część czasu wykonania skryptu zajmowało ładowanie klas ORMa (require_once!). W normalnych warunkach tego typu operacje są prawie niewidoczne. Z pomocą przyszedł mechanizm kompilacji, który łączy pliki z głównymi klasami Doctrine w jeden. Dzięki temu większość klas potrzebnych Doctrine podczas żądania załączanych jest tylko raz. W pluginie sfTaskExtraPlugin znajdziemy task doctrine:compile, który realizuje to zadanie. Notatka: serwer, na którym zainstalowano wspomnianą aplikację miał więcej problemów (np źle skonfigurowane APC). Uwydatniły one problem wolnego ładowania klas. Nie mniej jednak kompilacja miała swój wkład w poprawę wydajności.
Instalacja sfTaskExtraPlugin
./symfony plugin:install sfTaskExtraPlugin
Kompilacja Doctrine
Doctrine skompilujemy tylko ze wsparciem dla mysql, a wynik zapiszemy do pliku lib/doctrine.compiled.php:
./symfony doctrine:compile --driver=mysql lib/doctrine.compiled.php
Tak jak zasugeruje nam komunikat po kompilacji, załączamy skompilowany plik w ProjectConfiguration:
public function setup()
{
// ...
if ($this instanceof sfApplicationConfiguration && !$this->isDebug())
{
require_once sfConfig::get('sf_lib_dir') . '/doctrine.compiled.php';
}
}
Warunkiem poprawnego działania aplikacji po kompilacji jest używanie klasy Doctrine_Core, a nie Doctrine. Task działa z najnowszymi wersjami symfony 1.3 i 1.4.