Symfony2 Slow Initialization Time Symfony2 Slow Initialization Time symfony symfony

Symfony2 Slow Initialization Time


I had 5-30 sec responses from Symfony2 by default. Now it's ~500ms in dev environment.

Then I modified the following things in php.ini:

  • set realpath_cache_size = 4M (or more)
  • disabled XDebug completely (test with phpinfo)
  • realpath_cache_ttl=7200
  • enabled and set OPcache (or APC) correctly
  • restarted Apache in order to have php.ini reloaded

And voilá, responses went under 2 secs in dev mode! Hope it helps.

Before: 6779 msenter image description here

After: 1587 ms

enter image description here

Symfony2 reads classes from thousands of files and that's a slow process. When using a small PHP realpath cache, file paths need to be resolved one by one every time a new request is made in the dev environment if they are not in PHP's realpath cache. The realpath cache is too small by default for Symfony2. In prod this is not a problem of course.

Cache metadata:

Caching the metadata (e.g. mappings) is also very important for further performance boost:

doctrine:    orm:        entity_managers:            default:                metadata_cache_driver: apc                query_cache_driver: apc                result_cache_driver: apc

You need to enable APCu for this. It's APC without bytecode cache, as OPCache already does opcode caching. OPCache is built in since PHP 5.5.

---- After: 467 ms ----

(in prod environment the same response is ~80 ms)

enter image description here

Please note, this is project uses 30+ bundles and has tens of thousands of lines of code, almost hundred own services, so 0.5s is quite good on a local Windows environment using just a few simple optimizations.


I figured out the cause of the problem (and its not Symfony2). For some reason on the ubuntu VM, the modification times on certain files are incorrect (ie in the future, etc). When symfony2 checks these times using filemtime() against its registry, it determines that the cache is not longer fresh and it rebuilds the whole thing. I haven't been able to figure out why it is doing that yet.


I also needed to disable xdebug (v2.2.21) to debug apache2 max timeout loading on my macbook. It was installed using macports:

sudo port install php54-xdebug.

With xdebug enabled, every page run out max loading time, with a fatal error exceeding max timeout message dispatched. When disabled, everything just loads fine in a reasonable expected time. I came to this using MAMP, no xdebug enabled by default, and apache2 just works fast as usual. I may change for another debugger, that's a pitty, because xdebug worked fine before.

Config:

  • MacOSX 10.6.8
  • macports 2.1.3
  • Apache 2.2.24
  • php 5.4