Your SlideShare is downloading. ×
0
Por qué Symfony2 es tan rápidoCarlos GranadosCarlos Granados
Por qué Symfony2 es tan rápidoCarlos Granados
Por qué Symfony2 es tan rápidoCarlos Granados
Por qué Symfony2 es tan rápidoCarlos Granados
Por qué Symfony2 es tan rápidoCarlos Granados• Crear el Kernel y leer la petición• Leer configuración• Compilar y cargar e...
Por qué Symfony2 es tan rápidoCarlos Granados¿Para cuándo dice que lo quiere?
Por qué Symfony2 es tan rápidoCarlos Granados• Crear el Kernel y leer la petición• Leer configuración• Compilar y cargar e...
Por qué Symfony2 es tan rápidoCarlos GranadosNo hablamos del caché HTTP“La mejor petición es aquella que nunca llega anues...
Por qué Symfony2 es tan rápidoCarlos GranadosHablamos del caché de aplicaciónapp/cache
Por qué Symfony2 es tan rápidoCarlos Granadosapp.phpEntornos y depuración$kernel = new AppKernel(prod, false);app_dev.php$...
Por qué Symfony2 es tan rápidoCarlos Granadosconfig_dev.phweb_profiler:toolbar: trueEl entorno se usa para saber qué fiche...
Por qué Symfony2 es tan rápidoCarlos GranadosEl valor de debug es el que realmente distingue unentorno de depuración de un...
Por qué Symfony2 es tan rápidoCarlos GranadosNormalmente ‘prod’ = no debug y ‘dev’=debugPero NO tiene por qué ser asíPodem...
Por qué Symfony2 es tan rápidoCarlos GranadosAPC“Sin APC Symfony no sería posible”
Por qué Symfony2 es tan rápidoCarlos GranadosAPC: evitar que compruebe si tiene que recompilar ficherosapc.stat=0 en php.i...
Por qué Symfony2 es tan rápidoCarlos GranadosAutoload: como encuentra las clases el autoloaderif (isset($this->prefixes[$f...
Por qué Symfony2 es tan rápidoCarlos GranadosAutoload: crear un classmap con Composerphp composer.phar dump-autoload --opt...
Por qué Symfony2 es tan rápidoCarlos GranadosAutoload: utilizar ApcClassLoaderweb/app.php// Use APC for autoloading to imp...
Por qué Symfony2 es tan rápidoCarlos GranadosBootstrapapp/bootstrap.php.cache• Construido por Composer durante lainstalaci...
Por qué Symfony2 es tan rápidoCarlos GranadosClasses.phpapp/cache/prod/classes.php• Se construye a partir de un mapa de cl...
Por qué Symfony2 es tan rápidoCarlos GranadosClasses.mapapp/cache/prod/classes.mapContiene las clases que cada bundle deci...
Por qué Symfony2 es tan rápidoCarlos GranadosClasses.mapapp/cache/prod/classes.mapPodemos añadir clases de nuestros bundle...
Por qué Symfony2 es tan rápidoCarlos GranadosContenedor de dependenciasapp/cache/prod/appProdProjectContainer.php• Lo cons...
Por qué Symfony2 es tan rápidoCarlos GranadosContenedor de dependencias…/*** Gets the doctrine service.** This service is ...
Por qué Symfony2 es tan rápidoCarlos GranadosEnrutadorapp/cache/prod/appProdUrlMatcher.php• Lo construye el componente de ...
Por qué Symfony2 es tan rápidoCarlos Granadosif (0 === strpos($pathinfo, /_)) {// _wdtif (0 === strpos($pathinfo, /_wdt) &...
Por qué Symfony2 es tan rápidoCarlos Granados# app/config/config_prod.ymlparameters:router.options.matcher.cache_class: ~ ...
Por qué Symfony2 es tan rápidoCarlos Granadosstatic private $declaredRoutes = array(_demo => array ( 0 => array ( ), 1 => ...
Por qué Symfony2 es tan rápidoCarlos GranadosPlantillasapp/cache/prod/templates.php• Lo construye un caché warmer del comp...
Por qué Symfony2 es tan rápidoCarlos Granadosreturn array (…AcmeDemoBundle:Demo:index.html.twig =>/Z:/stack/src/Acme/DemoB...
Por qué Symfony2 es tan rápidoCarlos GranadosOtros elementos en el cache• Anotaciones• Traducciones• Assetic• Doctrine• Et...
Por qué Symfony2 es tan rápidoCarlos GranadosSymfonyComponentHttpKernelCacheWarmerCacheWarmerInterfaceCrear un cache warme...
Por qué Symfony2 es tan rápidoCarlos Granados• Query cache• Metadata cache• Result cacheCache de Doctrinedoctrine:orm:meta...
Por qué Symfony2 es tan rápidoCarlos Granados• Hacer un cache:clear (con warmup) cada vez que instalemos en producción• ap...
Por qué Symfony2 es tan rápidoCarlos Granados
Por qué Symfony2 es tan rápidoCarlos Granados¡¡Gracias!!• carlos@planetapluton.com• @carlos_granados• http://es.linkedin.c...
Por qué Symfony2 es tan rápido
Por qué Symfony2 es tan rápido
Upcoming SlideShare
Loading in...5
×

Por qué Symfony2 es tan rápido

2,765

Published on

Mi charla en deSymfony 2013 explicando la cache de aplicaciones de Symfony que es uno de los elementos que más contribuyen a su velocidad.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,765
On Slideshare
0
From Embeds
0
Number of Embeds
18
Actions
Shares
0
Downloads
61
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Por qué Symfony2 es tan rápido"

  1. 1. Por qué Symfony2 es tan rápidoCarlos GranadosCarlos Granados
  2. 2. Por qué Symfony2 es tan rápidoCarlos Granados
  3. 3. Por qué Symfony2 es tan rápidoCarlos Granados
  4. 4. Por qué Symfony2 es tan rápidoCarlos Granados
  5. 5. Por qué Symfony2 es tan rápidoCarlos Granados• Crear el Kernel y leer la petición• Leer configuración• Compilar y cargar el contenedorde dependencias• Aplicar la configuración deseguridad• Leer todas las rutas definidas• Decidir qué ruta aplicar• Ejecutar al controlador apropiado• Leer la configuración de lasentidades• Conectarse con la base de datos• Consultar la base de datos• Convertir los resultados de labase de datos en entidades• Construir las rutas que podamosnecesitar• Encontrar qué plantilla twig usar• Compilar la plantilla twig• Ejecutar la plantilla twig• Convertir el resultado de laplantilla twig en una respuesta• Devolver esa respuesta al cliente• Autocargar todas las clasesimplicadas¿Qué hace Symfony cuando recibe una petición?
  6. 6. Por qué Symfony2 es tan rápidoCarlos Granados¿Para cuándo dice que lo quiere?
  7. 7. Por qué Symfony2 es tan rápidoCarlos Granados• Crear el Kernel y leer la petición• Leer configuración• Compilar y cargar el contenedorde dependencias• Aplicar la configuración deseguridad• Leer todas las rutas definidas• Decidir qué ruta aplicar• Ejecutar el controlador apropiado• Leer la configuración de lasentidades• Conectarse con la base de datos• Consultar la base de datos• Convertir los resultados de labase de datos en entidades• Construir las rutas que podamosnecesitar• Encontrar qué plantilla twig usar• Compilar la plantilla twig• Ejecutar la plantilla twig• Convertir el resultado de laplantilla twig en una respuesta• Devolver esa respuesta al cliente• Autocargar todas las clasesimplicadasMuchos de estos procesos están cacheados
  8. 8. Por qué Symfony2 es tan rápidoCarlos GranadosNo hablamos del caché HTTP“La mejor petición es aquella que nunca llega anuestro servidor”
  9. 9. Por qué Symfony2 es tan rápidoCarlos GranadosHablamos del caché de aplicaciónapp/cache
  10. 10. Por qué Symfony2 es tan rápidoCarlos Granadosapp.phpEntornos y depuración$kernel = new AppKernel(prod, false);app_dev.php$kernel = new AppKernel(‘dev, true);Entorno debug
  11. 11. Por qué Symfony2 es tan rápidoCarlos Granadosconfig_dev.phweb_profiler:toolbar: trueEl entorno se usa para saber qué fichero deconfiguración usarconfig_prod.phweb_profiler:toolbar: falseY también qué subdirectorio de app/cache utilizarapp/cache/prodapp/cache/dev
  12. 12. Por qué Symfony2 es tan rápidoCarlos GranadosEl valor de debug es el que realmente distingue unentorno de depuración de uno de producción%kernel.debug%- Si se muestran los errores o no (enSymfony 2.3 está separado)- Si se actualiza la caché en cadaejecución
  13. 13. Por qué Symfony2 es tan rápidoCarlos GranadosNormalmente ‘prod’ = no debug y ‘dev’=debugPero NO tiene por qué ser asíPodemos, por ejemplo, crear un ‘app_staging.php’con la configuración del entorno de producción perocon debug=true$kernel = new AppKernel(prod, true);
  14. 14. Por qué Symfony2 es tan rápidoCarlos GranadosAPC“Sin APC Symfony no sería posible”
  15. 15. Por qué Symfony2 es tan rápidoCarlos GranadosAPC: evitar que compruebe si tiene que recompilar ficherosapc.stat=0 en php.iniAl subir nuevo código hay que vaciar el caché APC:• Reiniciar el servidor• Crear un script que borre esta caché yejecutarlo (con una llamada http)
  16. 16. Por qué Symfony2 es tan rápidoCarlos GranadosAutoload: como encuentra las clases el autoloaderif (isset($this->prefixes[$first])) {foreach ($this->prefixes[$first] as $prefix => $dirs) {if (0 === strpos($class, $prefix)) {foreach ($dirs as $dir) {if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {return $dir . DIRECTORY_SEPARATOR . $classPath;}}}}}vendor/composer/ClassLoader.php
  17. 17. Por qué Symfony2 es tan rápidoCarlos GranadosAutoload: crear un classmap con Composerphp composer.phar dump-autoload --optimizevendor/composer/autoload_classmap.php…AcmeDemoBundleAcmeDemoBundle =>$baseDir . /src/Acme/DemoBundle/AcmeDemoBundle.php,AcmeDemoBundleControllerDemoController =>$baseDir . /src/Acme/DemoBundle/Controller/DemoController.php,AcmeDemoBundleControllerSecuredController =>$baseDir . /src/Acme/DemoBundle/Controller/SecuredController.php,AcmeDemoBundleControllerWelcomeController =>$baseDir . /src/Acme/DemoBundle/Controller/WelcomeController.php,…
  18. 18. Por qué Symfony2 es tan rápidoCarlos GranadosAutoload: utilizar ApcClassLoaderweb/app.php// Use APC for autoloading to improve performance// Change sf2 by the prefix you want in order to prevent keyconflict with another application$loader = new ApcClassLoader(sf2, $loader);$loader->register(true);
  19. 19. Por qué Symfony2 es tan rápidoCarlos GranadosBootstrapapp/bootstrap.php.cache• Construido por Composer durante lainstalación• Se incluye en los front controllers• Contiene las clases básicas necesarias parainicializar el entorno Symfony:ContainerAwareInterface, Container, Kernel, ClassCollectionLoader, ApcClassLoader, Bundle,ConfigCache, HttpKernel
  20. 20. Por qué Symfony2 es tan rápidoCarlos GranadosClasses.phpapp/cache/prod/classes.php• Se construye a partir de un mapa de clases:classes.map• En modo debug se comprueba cada clase delmapa para ver si ha cambiado y si es así sereconstruye el fichero classes.php• En modo no debug sólo se construyeclasses.php si no existe
  21. 21. Por qué Symfony2 es tan rápidoCarlos GranadosClasses.mapapp/cache/prod/classes.mapContiene las clases que cada bundle decida incluir para optimizar$this->addClassesToCompile(array(Twig_Environment,Twig_Extension,Twig_Extension_Core,Twig_Extension_Escaper,Twig_Extension_Optimizer,Twig_LoaderInterface,Twig_Markup,Twig_Template,));Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php
  22. 22. Por qué Symfony2 es tan rápidoCarlos GranadosClasses.mapapp/cache/prod/classes.mapPodemos añadir clases de nuestros bundlespublic function load(array $configs, ContainerBuilder $container){…$this->addClassesToCompile(array(AcmeDemoBundleTwigExtensionDemoExtension,AcmeDemoBundleTwigEventListenerControllerListener,));}Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php
  23. 23. Por qué Symfony2 es tan rápidoCarlos GranadosContenedor de dependenciasapp/cache/prod/appProdProjectContainer.php• Lo construye el compilador del contenedor dedependencias• En modo debug se comprueba un ficheroappDevDebugProjectContainer.php.metagenerado al compilar. Si alguna de las clasesincluidas ha cambiado, regeneramos elcontenedor• En modo no debug sólo se construye elcontenedor si no existe
  24. 24. Por qué Symfony2 es tan rápidoCarlos GranadosContenedor de dependencias…/*** Gets the doctrine service.** This service is shared.* This method always returns the same instance of the service.** @return DoctrineBundleDoctrineBundleRegistry ADoctrineBundleDoctrineBundleRegistry instance.*/protected function getDoctrineService(){return $this->services[doctrine] = newDoctrineBundleDoctrineBundleRegistry($this, array(default => doctrine.dbal.default_connection), array(default => doctrine.orm.default_entity_manager),default, default);}…app/cache/prod/appProdProjectContainer.php
  25. 25. Por qué Symfony2 es tan rápidoCarlos GranadosEnrutadorapp/cache/prod/appProdUrlMatcher.php• Lo construye el componente de enrutación• En modo debug se comprueba un ficheroappDevUrlMatcher.php.meta generado por elrouter. Si alguno de los recursos (ficherosyml, controladores, etc…) incluidos hacambiado, regeneramos el enrutador• En modo no debug sólo se construye el enrutadorsi no existe
  26. 26. Por qué Symfony2 es tan rápidoCarlos Granadosif (0 === strpos($pathinfo, /_)) {// _wdtif (0 === strpos($pathinfo, /_wdt) &&preg_match(#^/_wdt/(?P<token>[^/]++)$#s, $pathinfo, $matches)) {return $this->mergeDefaults(array_replace($matches, array(_route =>_wdt)), array (_controller=>web_profiler.controller.profiler:toolbarAction,));}app/cache/prod/appProdUrlMatcher.phpEnrutadorEs importante que las rutas más usadas estén al principio:• Definirlas antes en los ficheros yml• Definirlas antes en los controladores si usamos anotaciones
  27. 27. Por qué Symfony2 es tan rápidoCarlos Granados# app/config/config_prod.ymlparameters:router.options.matcher.cache_class: ~ # disable router cacherouter.options.matcher_class: SymfonyComponentRoutingMatcherApacheUrlMatcherUsar el Enrutador de Apache$ php app/console router:dump-apache -e=prod --no-debug# skip "real" requestsRewriteCond %{REQUEST_FILENAME} -fRewriteRule .* - [QSA,L]# helloRewriteCond %{REQUEST_URI} ^/hello/([^/]+?)$RewriteRule .* app.php[QSA,L,E=_ROUTING__route:hello,E=_ROUTING_name:%1,E=_ROUTING__controller:AcmeDemoBundle:Demo:hello]// web/app.php…use SymfonyComponentHttpFoundationApacheRequest;…$kernel->handle(ApacheRequest::createFromGlobals())->send();
  28. 28. Por qué Symfony2 es tan rápidoCarlos Granadosstatic private $declaredRoutes = array(_demo => array ( 0 => array ( ), 1 => array ( _controller=> AcmeDemoBundleControllerDemoController::indexAction, ), 2=> array ( ), 3 => array ( 0 => array ( 0 =>text, 1 => /demo/, ), ), 4 => array ( ),),_demo_hello => array ( 0 => array ( 0 => name, ), 1=> array ( _controller =>AcmeDemoBundleControllerDemoController::helloAction, ), 2=> array ( ), 3 => array ( 0 => array ( 0 =>variable, 1 => /, 2 => [^/]++, 3 =>name, ), 1 => array ( 0 => text, 1 =>/demo/hello, ), ), 4 => array ( ),),…app/cache/prod/appProdUrlGenerator.phpEnrutador: generador de rutas
  29. 29. Por qué Symfony2 es tan rápidoCarlos GranadosPlantillasapp/cache/prod/templates.php• Lo construye un caché warmer del componentede plantillas• En modo debug no se construye• Hay un directorio app/cache/prod/twig dondeestán las plantillas compiladas. En modo nodebug sólo se genera cada plantilla si no existe.• La estructura del directorio Twig es un poco rara.Puede ser dificil encontrar la plantilla compilada.Usar una búsqueda global por ficheros con elnombre de la plantilla.
  30. 30. Por qué Symfony2 es tan rápidoCarlos Granadosreturn array (…AcmeDemoBundle:Demo:index.html.twig =>/Z:/stack/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig,AcmeDemoBundle:Demo:hello.html.twig =>/Z:/stack/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig,::base.html.twig =>/Z:/stack/app/Resources/views/base.html.twig,);app/cache/prod/templates.phpPlantillas// line 5public function block_content($context, array $blocks = array()){// line 6echo " <h1>Hello ";echo twig_escape_filter($this->env, (isset($context["name"]) ?$context["name"] : null), "html", null, true);echo "!</h1>";}
  31. 31. Por qué Symfony2 es tan rápidoCarlos GranadosOtros elementos en el cache• Anotaciones• Traducciones• Assetic• Doctrine• Etc…Muchos de estos elementos se crean con un cache warmer.
  32. 32. Por qué Symfony2 es tan rápidoCarlos GranadosSymfonyComponentHttpKernelCacheWarmerCacheWarmerInterfaceCrear un cache warmer para tu bundlepublic function warmUp($cacheDir){// Creamos el contenido a guardar el el cache$content = ...;// Lo guardamos en el cache$this->writeCacheFile($cacheDir./filename.php, $content);}public function warmUp($cacheDir);public function isOptional();SymfonyComponentHttpKernelCacheWarmerCacheWarmer
  33. 33. Por qué Symfony2 es tan rápidoCarlos Granados• Query cache• Metadata cache• Result cacheCache de Doctrinedoctrine:orm:metadata_cache_driver: apcquery_cache_driver:type: serviceid: my_doctrine_common_cache_serviceresult_cache_driver:type: memcachehost: localhostport: 11211instance_class: Memcache…
  34. 34. Por qué Symfony2 es tan rápidoCarlos Granados• Hacer un cache:clear (con warmup) cada vez que instalemos en producción• apc.stat=0 en php.ini• Crear un classmap con Composer• Activar ApcClassLoader• Listar las clases que queremos añadir a classes.map en nuestro bundle• Ordenar las rutas para que las más usadas aparezcan antes• Usar el enrutador de Apache• Crear cache warmers con ficheros inicializados por nuestro bundleConclusiones
  35. 35. Por qué Symfony2 es tan rápidoCarlos Granados
  36. 36. Por qué Symfony2 es tan rápidoCarlos Granados¡¡Gracias!!• carlos@planetapluton.com• @carlos_granados• http://es.linkedin.com/in/carlosgranados¿Preguntas?• https://joind.in/8852
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×