SlideShare a Scribd company logo
1 of 38
Por qué Symfony2 es tan rápido
Carlos Granados
Carlos Granados
Por qué Symfony2 es tan rápido
Carlos Granados
Por qué Symfony2 es tan rápido
Carlos Granados
Por qué Symfony2 es tan rápido
Carlos Granados
Por qué Symfony2 es tan rápido
Carlos Granados
• Crear el Kernel y leer la petición
• Leer configuración
• Compilar y cargar el contenedor
de dependencias
• Aplicar la configuración de
seguridad
• Leer todas las rutas definidas
• Decidir qué ruta aplicar
• Ejecutar al controlador apropiado
• Leer la configuración de las
entidades
• Conectarse con la base de datos
• Consultar la base de datos
• Convertir los resultados de la
base de datos en entidades
• Construir las rutas que podamos
necesitar
• Encontrar qué plantilla twig usar
• Compilar la plantilla twig
• Ejecutar la plantilla twig
• Convertir el resultado de la
plantilla twig en una respuesta
• Devolver esa respuesta al cliente
• Autocargar todas las clases
implicadas
¿Qué hace Symfony cuando recibe una petición?
Por qué Symfony2 es tan rápido
Carlos Granados
¿Para cuándo dice que lo quiere?
Por qué Symfony2 es tan rápido
Carlos Granados
• Crear el Kernel y leer la petición
• Leer configuración
• Compilar y cargar el contenedor
de dependencias
• Aplicar la configuración de
seguridad
• Leer todas las rutas definidas
• Decidir qué ruta aplicar
• Ejecutar el controlador apropiado
• Leer la configuración de las
entidades
• Conectarse con la base de datos
• Consultar la base de datos
• Convertir los resultados de la
base de datos en entidades
• Construir las rutas que podamos
necesitar
• Encontrar qué plantilla twig usar
• Compilar la plantilla twig
• Ejecutar la plantilla twig
• Convertir el resultado de la
plantilla twig en una respuesta
• Devolver esa respuesta al cliente
• Autocargar todas las clases
implicadas
Muchos de estos procesos están cacheados
Por qué Symfony2 es tan rápido
Carlos Granados
No hablamos del caché HTTP
“La mejor petición es aquella que nunca llega a
nuestro servidor”
Por qué Symfony2 es tan rápido
Carlos Granados
Hablamos del caché de aplicación
app/cache
Por qué Symfony2 es tan rápido
Carlos Granados
app.php
Entornos y depuración
$kernel = new AppKernel('prod', false);
app_dev.php
$kernel = new AppKernel(‘dev', true);
Entorno debug
Por qué Symfony2 es tan rápido
Carlos Granados
config_dev.ph
web_profiler:
toolbar: true
El entorno se usa para saber qué fichero de
configuración usar
config_prod.ph
web_profiler:
toolbar: false
Y también qué subdirectorio de app/cache utilizar
app/cache/prod
app/cache/dev
Por qué Symfony2 es tan rápido
Carlos Granados
El valor de debug es el que realmente distingue un
entorno de depuración de uno de producción
%kernel.debug%
- Si se muestran los errores o no (en
Symfony 2.3 está separado)
- Si se actualiza la caché en cada
ejecución
Por qué Symfony2 es tan rápido
Carlos Granados
Normalmente ‘prod’ = no debug y ‘dev’=debug
Pero NO tiene por qué ser así
Podemos, por ejemplo, crear un ‘app_staging.php’
con la configuración del entorno de producción pero
con debug=true
$kernel = new AppKernel('prod', true);
Por qué Symfony2 es tan rápido
Carlos Granados
APC
“Sin APC Symfony no sería posible”
Por qué Symfony2 es tan rápido
Carlos Granados
APC: evitar que compruebe si tiene que recompilar ficheros
apc.stat=0 en php.ini
Al subir nuevo código hay que vaciar el caché APC:
• Reiniciar el servidor
• Crear un script que borre esta caché y
ejecutarlo (con una llamada http)
Por qué Symfony2 es tan rápido
Carlos Granados
Autoload: como encuentra las clases el autoloader
if (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ápido
Carlos Granados
Autoload: crear un classmap con Composer
php composer.phar dump-autoload --optimize
vendor/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ápido
Carlos Granados
Autoload: utilizar ApcClassLoader
web/app.php
// Use APC for autoloading to improve performance
// Change 'sf2' by the prefix you want in order to prevent key
conflict with another application
$loader = new ApcClassLoader('sf2', $loader);
$loader->register(true);
Por qué Symfony2 es tan rápido
Carlos Granados
Bootstrap
app/bootstrap.php.cache
• Construido por Composer durante la
instalación
• Se incluye en los front controllers
• Contiene las clases básicas necesarias para
inicializar el entorno Symfony:
ContainerAwareInterface, Container, Kernel, Cl
assCollectionLoader, ApcClassLoader, Bundle,
ConfigCache, HttpKernel
Por qué Symfony2 es tan rápido
Carlos Granados
Classes.php
app/cache/prod/classes.php
• Se construye a partir de un mapa de clases:
classes.map
• En modo debug se comprueba cada clase del
mapa para ver si ha cambiado y si es así se
reconstruye el fichero classes.php
• En modo no debug sólo se construye
classes.php si no existe
Por qué Symfony2 es tan rápido
Carlos Granados
Classes.map
app/cache/prod/classes.map
Contiene 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ápido
Carlos Granados
Classes.map
app/cache/prod/classes.map
Podemos añadir clases de nuestros bundles
public function load(array $configs, ContainerBuilder $container)
{
…
$this->addClassesToCompile(array(
'AcmeDemoBundleTwigExtensionDemoExtension',
'AcmeDemoBundleTwigEventListenerControllerListener',
));
}
Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php
Por qué Symfony2 es tan rápido
Carlos Granados
Contenedor de dependencias
app/cache/prod/appProdProjectContainer.php
• Lo construye el compilador del contenedor de
dependencias
• En modo debug se comprueba un fichero
appDevDebugProjectContainer.php.meta
generado al compilar. Si alguna de las clases
incluidas ha cambiado, regeneramos el
contenedor
• En modo no debug sólo se construye el
contenedor si no existe
Por qué Symfony2 es tan rápido
Carlos Granados
Contenedor de dependencias
…
/**
* Gets the 'doctrine' service.
*
* This service is shared.
* This method always returns the same instance of the service.
*
* @return DoctrineBundleDoctrineBundleRegistry A
DoctrineBundleDoctrineBundleRegistry instance.
*/
protected function getDoctrineService()
{
return $this->services['doctrine'] = new
DoctrineBundleDoctrineBundleRegistry($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ápido
Carlos Granados
Enrutador
app/cache/prod/appProdUrlMatcher.php
• Lo construye el componente de enrutación
• En modo debug se comprueba un fichero
appDevUrlMatcher.php.meta generado por el
router. Si alguno de los recursos (ficheros
yml, controladores, etc…) incluidos ha
cambiado, regeneramos el enrutador
• En modo no debug sólo se construye el enrutador
si no existe
Por qué Symfony2 es tan rápido
Carlos Granados
if (0 === strpos($pathinfo, '/_')) {
// _wdt
if (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.php
Enrutador
Es 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ápido
Carlos Granados
# app/config/config_prod.yml
parameters:
router.options.matcher.cache_class: ~ # disable router cache
router.options.matcher_class: SymfonyComponentRoutingMatcherApacheUrlMatcher
Usar el Enrutador de Apache
$ php app/console router:dump-apache -e=prod --no-debug
# skip "real" requests
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [QSA,L]
# hello
RewriteCond %{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ápido
Carlos Granados
static 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.php
Enrutador: generador de rutas
Por qué Symfony2 es tan rápido
Carlos Granados
Plantillas
app/cache/prod/templates.php
• Lo construye un caché warmer del componente
de plantillas
• En modo debug no se construye
• Hay un directorio app/cache/prod/twig donde
están las plantillas compiladas. En modo no
debug 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 el
nombre de la plantilla.
Por qué Symfony2 es tan rápido
Carlos Granados
return 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.php
Plantillas
// line 5
public function block_content($context, array $blocks = array())
{
// line 6
echo " <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ápido
Carlos Granados
Otros 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ápido
Carlos Granados
SymfonyComponentHttpKernelCacheWarmerCacheWarmerInterface
Crear un cache warmer para tu bundle
public 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ápido
Carlos Granados
• Query cache
• Metadata cache
• Result cache
Cache de Doctrine
doctrine:
orm:
metadata_cache_driver: apc
query_cache_driver:
type: service
id: my_doctrine_common_cache_service
result_cache_driver:
type: memcache
host: localhost
port: 11211
instance_class: Memcache
…
Por qué Symfony2 es tan rápido
Carlos 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 bundle
Conclusiones
Por qué Symfony2 es tan rápido
Carlos Granados
Por qué Symfony2 es tan rápido
Carlos Granados
¡¡Gracias!!
• carlos@planetapluton.com
• @carlos_granados
• http://es.linkedin.com/in/carlosgranados
¿Preguntas?
• https://joind.in/8852

More Related Content

What's hot

Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016Agencia INNN
 
Ansible administracion simplificada
Ansible   administracion simplificada Ansible   administracion simplificada
Ansible administracion simplificada bcoca
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaAgencia INNN
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvmsuperserch
 
Apache, getting the best version
Apache, getting the best versionApache, getting the best version
Apache, getting the best versionIvan Ortega
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPDaniel Primo
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 
API REST conceptos (Rails-api)
API REST conceptos (Rails-api)API REST conceptos (Rails-api)
API REST conceptos (Rails-api)Daryl Moreno
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Asier Marqués
 
Introduccion a Ansible
Introduccion a AnsibleIntroduccion a Ansible
Introduccion a AnsibleOsvaldo
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsDiacode
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoRaul Fraile
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Diacode
 

What's hot (17)

Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
Ansible administracion simplificada
Ansible   administracion simplificada Ansible   administracion simplificada
Ansible administracion simplificada
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Taller de Capistrano
Taller de CapistranoTaller de Capistrano
Taller de Capistrano
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvm
 
Apache, getting the best version
Apache, getting the best versionApache, getting the best version
Apache, getting the best version
 
Introducción a Ansible
Introducción a AnsibleIntroducción a Ansible
Introducción a Ansible
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
API REST conceptos (Rails-api)
API REST conceptos (Rails-api)API REST conceptos (Rails-api)
API REST conceptos (Rails-api)
 
Fabric más allá de lo básico
Fabric más allá de lo básicoFabric más allá de lo básico
Fabric más allá de lo básico
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 
Introduccion a Ansible
Introduccion a AnsibleIntroduccion a Ansible
Introduccion a Ansible
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on Rails
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimiento
 
PHP en el 2015
PHP en el 2015PHP en el 2015
PHP en el 2015
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)
 

Viewers also liked

BDD con Behat y Mink en Symfony2
BDD con Behat y Mink en Symfony2BDD con Behat y Mink en Symfony2
BDD con Behat y Mink en Symfony2Carlos Granados
 
Making Symofny shine with Varnish - SymfonyCon Madrid 2014
Making Symofny shine with Varnish - SymfonyCon Madrid 2014Making Symofny shine with Varnish - SymfonyCon Madrid 2014
Making Symofny shine with Varnish - SymfonyCon Madrid 2014Barel Barelon
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPHP Vigo
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasoshydras_cs
 
Symfony plugins - decharlas
Symfony plugins - decharlasSymfony plugins - decharlas
Symfony plugins - decharlasDecharlas
 
Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2Javier López
 
Symfony2 Formacion y primeros pasos
Symfony2  Formacion y primeros pasosSymfony2  Formacion y primeros pasos
Symfony2 Formacion y primeros pasosSoni BM
 
Diferencias entre mapa conceptual y mapa mental
Diferencias entre mapa conceptual y mapa mentalDiferencias entre mapa conceptual y mapa mental
Diferencias entre mapa conceptual y mapa mentallicenciada_vanessahm
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricksJavier Eguiluz
 
Respuesta de García Linera a intelectuales sobre las ONG´s
Respuesta de García Linera a intelectuales sobre las ONG´sRespuesta de García Linera a intelectuales sobre las ONG´s
Respuesta de García Linera a intelectuales sobre las ONG´sJesús Alanoca
 

Viewers also liked (13)

Vivir Sin Jefe
Vivir Sin JefeVivir Sin Jefe
Vivir Sin Jefe
 
BDD con Behat y Mink en Symfony2
BDD con Behat y Mink en Symfony2BDD con Behat y Mink en Symfony2
BDD con Behat y Mink en Symfony2
 
Making Symofny shine with Varnish - SymfonyCon Madrid 2014
Making Symofny shine with Varnish - SymfonyCon Madrid 2014Making Symofny shine with Varnish - SymfonyCon Madrid 2014
Making Symofny shine with Varnish - SymfonyCon Madrid 2014
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigo
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Symfony plugins - decharlas
Symfony plugins - decharlasSymfony plugins - decharlas
Symfony plugins - decharlas
 
Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2
 
Symfony. La guia definitiva
Symfony. La guia definitivaSymfony. La guia definitiva
Symfony. La guia definitiva
 
Symfony2 Formacion y primeros pasos
Symfony2  Formacion y primeros pasosSymfony2  Formacion y primeros pasos
Symfony2 Formacion y primeros pasos
 
Diferencias entre mapa conceptual y mapa mental
Diferencias entre mapa conceptual y mapa mentalDiferencias entre mapa conceptual y mapa mental
Diferencias entre mapa conceptual y mapa mental
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
 
Respuesta de García Linera a intelectuales sobre las ONG´s
Respuesta de García Linera a intelectuales sobre las ONG´sRespuesta de García Linera a intelectuales sobre las ONG´s
Respuesta de García Linera a intelectuales sobre las ONG´s
 

Similar to Por qué Symfony2 es tan rápido

Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magentoOnestic
 
Conferencia Innovación en Técnicas de Ethical Hacking
Conferencia Innovación en Técnicas de Ethical HackingConferencia Innovación en Técnicas de Ethical Hacking
Conferencia Innovación en Técnicas de Ethical HackingHacking Bolivia
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosJavier Eguiluz
 
Taller: Exploración de redes con Nmap
Taller: Exploración de redes con NmapTaller: Exploración de redes con Nmap
Taller: Exploración de redes con NmapWebsec México, S.C.
 
Policyd: Instalacion y configuracion
Policyd: Instalacion y configuracionPolicyd: Instalacion y configuracion
Policyd: Instalacion y configuracioncriscega
 
Manual de Instalación y configuración Zimbra
Manual de Instalación  y configuración Zimbra Manual de Instalación  y configuración Zimbra
Manual de Instalación y configuración Zimbra Ignacio Lozano
 
Fail2ban instalacion configuracion
Fail2ban instalacion configuracionFail2ban instalacion configuracion
Fail2ban instalacion configuracioncriscega
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0wcuestas
 
Interchange How-To for Red Hat Linux ES4
Interchange How-To for Red Hat Linux ES4Interchange How-To for Red Hat Linux ES4
Interchange How-To for Red Hat Linux ES4David Ramirez
 
Interchange CMS - e-commerce
Interchange CMS - e-commerceInterchange CMS - e-commerce
Interchange CMS - e-commerceDavid Ramirez
 
28 el directorio sysconfig
28  el directorio sysconfig28  el directorio sysconfig
28 el directorio sysconfigAprende Viendo
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Edgar Dueñas
 
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...betabeers
 
Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Telefónica
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 

Similar to Por qué Symfony2 es tan rápido (20)

Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magento
 
Conferencia Innovación en Técnicas de Ethical Hacking
Conferencia Innovación en Técnicas de Ethical HackingConferencia Innovación en Técnicas de Ethical Hacking
Conferencia Innovación en Técnicas de Ethical Hacking
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
CRUD básico con Symfony
CRUD básico con SymfonyCRUD básico con Symfony
CRUD básico con Symfony
 
Sf2 pr5 mi primer proyecto
Sf2 pr5 mi primer proyectoSf2 pr5 mi primer proyecto
Sf2 pr5 mi primer proyecto
 
Taller: Exploración de redes con Nmap
Taller: Exploración de redes con NmapTaller: Exploración de redes con Nmap
Taller: Exploración de redes con Nmap
 
Policyd: Instalacion y configuracion
Policyd: Instalacion y configuracionPolicyd: Instalacion y configuracion
Policyd: Instalacion y configuracion
 
Rendimiento extremo en php
Rendimiento extremo en phpRendimiento extremo en php
Rendimiento extremo en php
 
Framework Catalyst
Framework CatalystFramework Catalyst
Framework Catalyst
 
Manual de Instalación y configuración Zimbra
Manual de Instalación  y configuración Zimbra Manual de Instalación  y configuración Zimbra
Manual de Instalación y configuración Zimbra
 
Fail2ban instalacion configuracion
Fail2ban instalacion configuracionFail2ban instalacion configuracion
Fail2ban instalacion configuracion
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0
 
Interchange How-To for Red Hat Linux ES4
Interchange How-To for Red Hat Linux ES4Interchange How-To for Red Hat Linux ES4
Interchange How-To for Red Hat Linux ES4
 
Interchange CMS - e-commerce
Interchange CMS - e-commerceInterchange CMS - e-commerce
Interchange CMS - e-commerce
 
Seguridad de las Redes
Seguridad de las RedesSeguridad de las Redes
Seguridad de las Redes
 
28 el directorio sysconfig
28  el directorio sysconfig28  el directorio sysconfig
28 el directorio sysconfig
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2
 
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
 
Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 

Recently uploaded

tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramDIDIERFERNANDOGUERRE
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 

Recently uploaded (20)

tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ram
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 

Por qué Symfony2 es tan rápido

  • 1.
  • 2.
  • 3. Por qué Symfony2 es tan rápido Carlos Granados Carlos Granados
  • 4. Por qué Symfony2 es tan rápido Carlos Granados
  • 5. Por qué Symfony2 es tan rápido Carlos Granados
  • 6. Por qué Symfony2 es tan rápido Carlos Granados
  • 7. Por qué Symfony2 es tan rápido Carlos Granados • Crear el Kernel y leer la petición • Leer configuración • Compilar y cargar el contenedor de dependencias • Aplicar la configuración de seguridad • Leer todas las rutas definidas • Decidir qué ruta aplicar • Ejecutar al controlador apropiado • Leer la configuración de las entidades • Conectarse con la base de datos • Consultar la base de datos • Convertir los resultados de la base de datos en entidades • Construir las rutas que podamos necesitar • Encontrar qué plantilla twig usar • Compilar la plantilla twig • Ejecutar la plantilla twig • Convertir el resultado de la plantilla twig en una respuesta • Devolver esa respuesta al cliente • Autocargar todas las clases implicadas ¿Qué hace Symfony cuando recibe una petición?
  • 8. Por qué Symfony2 es tan rápido Carlos Granados ¿Para cuándo dice que lo quiere?
  • 9. Por qué Symfony2 es tan rápido Carlos Granados • Crear el Kernel y leer la petición • Leer configuración • Compilar y cargar el contenedor de dependencias • Aplicar la configuración de seguridad • Leer todas las rutas definidas • Decidir qué ruta aplicar • Ejecutar el controlador apropiado • Leer la configuración de las entidades • Conectarse con la base de datos • Consultar la base de datos • Convertir los resultados de la base de datos en entidades • Construir las rutas que podamos necesitar • Encontrar qué plantilla twig usar • Compilar la plantilla twig • Ejecutar la plantilla twig • Convertir el resultado de la plantilla twig en una respuesta • Devolver esa respuesta al cliente • Autocargar todas las clases implicadas Muchos de estos procesos están cacheados
  • 10. Por qué Symfony2 es tan rápido Carlos Granados No hablamos del caché HTTP “La mejor petición es aquella que nunca llega a nuestro servidor”
  • 11. Por qué Symfony2 es tan rápido Carlos Granados Hablamos del caché de aplicación app/cache
  • 12. Por qué Symfony2 es tan rápido Carlos Granados app.php Entornos y depuración $kernel = new AppKernel('prod', false); app_dev.php $kernel = new AppKernel(‘dev', true); Entorno debug
  • 13. Por qué Symfony2 es tan rápido Carlos Granados config_dev.ph web_profiler: toolbar: true El entorno se usa para saber qué fichero de configuración usar config_prod.ph web_profiler: toolbar: false Y también qué subdirectorio de app/cache utilizar app/cache/prod app/cache/dev
  • 14. Por qué Symfony2 es tan rápido Carlos Granados El valor de debug es el que realmente distingue un entorno de depuración de uno de producción %kernel.debug% - Si se muestran los errores o no (en Symfony 2.3 está separado) - Si se actualiza la caché en cada ejecución
  • 15. Por qué Symfony2 es tan rápido Carlos Granados Normalmente ‘prod’ = no debug y ‘dev’=debug Pero NO tiene por qué ser así Podemos, por ejemplo, crear un ‘app_staging.php’ con la configuración del entorno de producción pero con debug=true $kernel = new AppKernel('prod', true);
  • 16. Por qué Symfony2 es tan rápido Carlos Granados APC “Sin APC Symfony no sería posible”
  • 17. Por qué Symfony2 es tan rápido Carlos Granados APC: evitar que compruebe si tiene que recompilar ficheros apc.stat=0 en php.ini Al subir nuevo código hay que vaciar el caché APC: • Reiniciar el servidor • Crear un script que borre esta caché y ejecutarlo (con una llamada http)
  • 18. Por qué Symfony2 es tan rápido Carlos Granados Autoload: como encuentra las clases el autoloader if (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
  • 19. Por qué Symfony2 es tan rápido Carlos Granados Autoload: crear un classmap con Composer php composer.phar dump-autoload --optimize vendor/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', …
  • 20. Por qué Symfony2 es tan rápido Carlos Granados Autoload: utilizar ApcClassLoader web/app.php // Use APC for autoloading to improve performance // Change 'sf2' by the prefix you want in order to prevent key conflict with another application $loader = new ApcClassLoader('sf2', $loader); $loader->register(true);
  • 21. Por qué Symfony2 es tan rápido Carlos Granados Bootstrap app/bootstrap.php.cache • Construido por Composer durante la instalación • Se incluye en los front controllers • Contiene las clases básicas necesarias para inicializar el entorno Symfony: ContainerAwareInterface, Container, Kernel, Cl assCollectionLoader, ApcClassLoader, Bundle, ConfigCache, HttpKernel
  • 22. Por qué Symfony2 es tan rápido Carlos Granados Classes.php app/cache/prod/classes.php • Se construye a partir de un mapa de clases: classes.map • En modo debug se comprueba cada clase del mapa para ver si ha cambiado y si es así se reconstruye el fichero classes.php • En modo no debug sólo se construye classes.php si no existe
  • 23. Por qué Symfony2 es tan rápido Carlos Granados Classes.map app/cache/prod/classes.map Contiene 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
  • 24. Por qué Symfony2 es tan rápido Carlos Granados Classes.map app/cache/prod/classes.map Podemos añadir clases de nuestros bundles public function load(array $configs, ContainerBuilder $container) { … $this->addClassesToCompile(array( 'AcmeDemoBundleTwigExtensionDemoExtension', 'AcmeDemoBundleTwigEventListenerControllerListener', )); } Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php
  • 25. Por qué Symfony2 es tan rápido Carlos Granados Contenedor de dependencias app/cache/prod/appProdProjectContainer.php • Lo construye el compilador del contenedor de dependencias • En modo debug se comprueba un fichero appDevDebugProjectContainer.php.meta generado al compilar. Si alguna de las clases incluidas ha cambiado, regeneramos el contenedor • En modo no debug sólo se construye el contenedor si no existe
  • 26. Por qué Symfony2 es tan rápido Carlos Granados Contenedor de dependencias … /** * Gets the 'doctrine' service. * * This service is shared. * This method always returns the same instance of the service. * * @return DoctrineBundleDoctrineBundleRegistry A DoctrineBundleDoctrineBundleRegistry instance. */ protected function getDoctrineService() { return $this->services['doctrine'] = new DoctrineBundleDoctrineBundleRegistry($this, array( 'default' => 'doctrine.dbal.default_connection'), array( 'default' => 'doctrine.orm.default_entity_manager'), 'default', 'default'); } … app/cache/prod/appProdProjectContainer.php
  • 27. Por qué Symfony2 es tan rápido Carlos Granados Enrutador app/cache/prod/appProdUrlMatcher.php • Lo construye el componente de enrutación • En modo debug se comprueba un fichero appDevUrlMatcher.php.meta generado por el router. Si alguno de los recursos (ficheros yml, controladores, etc…) incluidos ha cambiado, regeneramos el enrutador • En modo no debug sólo se construye el enrutador si no existe
  • 28. Por qué Symfony2 es tan rápido Carlos Granados if (0 === strpos($pathinfo, '/_')) { // _wdt if (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.php Enrutador Es 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
  • 29. Por qué Symfony2 es tan rápido Carlos Granados # app/config/config_prod.yml parameters: router.options.matcher.cache_class: ~ # disable router cache router.options.matcher_class: SymfonyComponentRoutingMatcherApacheUrlMatcher Usar el Enrutador de Apache $ php app/console router:dump-apache -e=prod --no-debug # skip "real" requests RewriteCond %{REQUEST_FILENAME} -f RewriteRule .* - [QSA,L] # hello RewriteCond %{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();
  • 30. Por qué Symfony2 es tan rápido Carlos Granados static 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.php Enrutador: generador de rutas
  • 31. Por qué Symfony2 es tan rápido Carlos Granados Plantillas app/cache/prod/templates.php • Lo construye un caché warmer del componente de plantillas • En modo debug no se construye • Hay un directorio app/cache/prod/twig donde están las plantillas compiladas. En modo no debug 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 el nombre de la plantilla.
  • 32. Por qué Symfony2 es tan rápido Carlos Granados return 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.php Plantillas // line 5 public function block_content($context, array $blocks = array()) { // line 6 echo " <h1>Hello "; echo twig_escape_filter($this->env, (isset($context["name"]) ? $context["name"] : null), "html", null, true); echo "!</h1>"; }
  • 33. Por qué Symfony2 es tan rápido Carlos Granados Otros elementos en el cache • Anotaciones • Traducciones • Assetic • Doctrine • Etc… Muchos de estos elementos se crean con un cache warmer.
  • 34. Por qué Symfony2 es tan rápido Carlos Granados SymfonyComponentHttpKernelCacheWarmerCacheWarmerInterface Crear un cache warmer para tu bundle public 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
  • 35. Por qué Symfony2 es tan rápido Carlos Granados • Query cache • Metadata cache • Result cache Cache de Doctrine doctrine: orm: metadata_cache_driver: apc query_cache_driver: type: service id: my_doctrine_common_cache_service result_cache_driver: type: memcache host: localhost port: 11211 instance_class: Memcache …
  • 36. Por qué Symfony2 es tan rápido Carlos 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 bundle Conclusiones
  • 37. Por qué Symfony2 es tan rápido Carlos Granados
  • 38. Por qué Symfony2 es tan rápido Carlos Granados ¡¡Gracias!! • carlos@planetapluton.com • @carlos_granados • http://es.linkedin.com/in/carlosgranados ¿Preguntas? • https://joind.in/8852