• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Por qué Symfony2 es tan rápido
 

Por qué Symfony2 es tan rápido

on

  • 2,593 views

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.

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.

Statistics

Views

Total Views
2,593
Views on SlideShare
1,694
Embed Views
899

Actions

Likes
3
Downloads
41
Comments
0

12 Embeds 899

http://yosymfony.com 331
http://librosweb.es 309
http://desymfony.com 181
http://www.desymfony.com 25
https://twitter.com 15
http://feeds.feedburner.com 12
http://devi-vm.local 10
http://cloud.feedly.com 7
http://feedly.com 4
http://desymfony.local 3
http://plus.url.google.com 1
http://digg.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Por qué Symfony2 es tan rápido Por qué Symfony2 es tan rápido Presentation Transcript

    • 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 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?
    • 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 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
    • Por qué Symfony2 es tan rápidoCarlos GranadosNo hablamos del caché HTTP“La mejor petición es aquella que nunca llega anuestro servidor”
    • 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$kernel = new AppKernel(‘dev, true);Entorno debug
    • 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
    • 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
    • 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);
    • 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.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)
    • 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
    • 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,…
    • 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);
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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();
    • 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
    • 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.
    • 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>";}
    • 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.
    • 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
    • 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…
    • 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
    • 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.com/in/carlosgranados¿Preguntas?• https://joind.in/8852