Miviejo amigo
Un pocosobre miEstoytrabajando con webs desde 2001Me encantainvestigar y meterme en problemasera solo un poco!
青玉男ao tama o
ao
Y porquéhablar de 1.4?
PreguntasLas hagoyo!
Quepodemosoptimizar?
Carga de procesoTiempoquepasa el servidorprocesando la web
Proveedor de InternetDesarrolladores BackendDesarrolladores Frontend
Tiempo de Espera
Miexperiencia
La optimizacióndueleVale la pena el esfuerzo?
Quepodemosmejorar
Hechos
+ Hechos
Herramientas
Debug Tool BarTodos la conocemos ya!
sfTimerManager$timer = sfTimerManager::getTimer("test");...var_export( $timer->addTime() );
sfTimerManager
sfTimer$timer = new sfTimer ("test");$timer->startTimer();...var_export( $timer->addTime() );
DoctrineQuepodemosoptimizar
Optimizando Doctrine
Cantidad de ConsultasOptimizando Doctrine
Tiempo de ConsultaOptimizando DoctrineTiempoquenos cuesta buscarinformación en la DB
Tiempo de HidrataciónOptimizando DoctrineQuees?http://www.doctrine-project.org/documentation/manual/1_2/en/data-hydratorsconstHYDRATE_RECORD            = 2;constHYDRATE_ARRAY             = 3;constHYDRATE_NONE              = 4;constHYDRATE_SCALAR            = 5;constHYDRATE_SINGLE_SCALAR     = 6;constHYDRATE_ON_DEMAND         = 7;constHYDRATE_ARRAY_HIERARCHY   = 8;constHYDRATE_RECORD_HIERARCHY  = 9;
Tiempo de HidrataciónOptimizando DoctrineQuées lo mínimoqueestamosbuscando?
Tiempo de HidrataciónOptimizando Doctrine$clist = Doctrine::getTable("Country")->createQuery()->select({fields})->execute({strategy});
Tiempo de HidrataciónOptimizando Doctrine$conn = Doctrine_Manager::connection();$data = $conn->execute("select * from countries")->fetchAll();
Tiempo de HidrataciónOptimizando DoctrinePara quequiero el ORM?$conn= Doctrine_Manager::connection();Para manejarlasconexiones!
Doctrine?Unainteresanteparadoja!
Tiempo de HidrataciónOptimizando DoctrineEjemplo!
Tiempo de HidrataciónOptimizando DoctrineUserTable::getInstance()        ->createQuery()        ->select ("id, name, surname, age")        ->where("is_deleted = ?", false)        ->andWhere("is_closed = ? ", false) ->andWhere(”age > ? ",  50 )->execute( array(), Doctrine_Core::HYDRATE_ARRAY);UserTable::getInstance()        ->createQuery()        ->select ("id, name, surname, age")        ->where("is_deleted = ?", false)        ->andWhere("is_closed = ? ", false)	->andWhere(”age > ? ",  50 )->execute( );Estrategia
Tiempo de HidrataciónOptimizando DoctrineCompatibilidad entre estrategias en la vista<td> <?phpecho$user->get("name") ?></td><td> <?phpecho$user->name ?></td><?php$user= $user->getRawValue() ?><td> <?phpecho$user["name"] ?></td>
T.  Conversión de ConsultaOptimizando Doctrine$q = Doctrine::getTable("Country")->createQuery();$q->getSqlQuery().0.006 segGallery1..n GalleryImagesn..1 Image$q= Doctrine::getTable("Gallery")->createQuery("g")->leftJoin("g.images");$q->getSqlQuery();0.1 seg
Conteo de RegistrosOptimizando Doctrine$clist = Doctrine::getTable("Country”)->findAll()->count();->createQuery()->count();->createQuery()->select("count(id)")->execute( array (), Doctrine::HYDRATE_NONE );$conn->execute("select count(id) as count from countries")->fetchAll();0.2 seg0.0056 seg0.01 seg0.00087 seg
PDOhttp://es2.php.net/manual/en/book.pdo.php
Select, Joins e IndicesOptimizando Doctrine$articles = Doctrine::getTable("Article")->createQuery("a")->leftJoin("a.pages p")->limit(100)->execute();->limit(1000)->execute();->limit(100)->execute( array(), Doctrine::HYDRATE_ARRAY );->limit(1000)->execute( array(), Doctrine::HYDRATE_ARRAY  );2.93 seg30.80 seg0.20 seg1.37 seg
Select, Joins e IndicesOptimizando DoctrineSELECT c.id, c.name , c.resume, c.disclaimer, c.product , c.description, \UNIX_TIMESTAMP(c.valid_start_at) as valid_start, UNIX_TIMESTAMP(c.valid_end_at) as valid_end, UNIX_TIMESTAMP(c.promotion_start_at) as promotion_start, UNIX_TIMESTAMP(c.promotion_end_at) as promotion_end, UNIX_TIMESTAMP(c.publish_at) as publish, \c.tracking_click, c.tracking_save_count, c.visibility_status_id, c.print_coupon, c.mobile_coupon, c.online_coupon, c.company_id,  cp.comercial_name as company_name, c.redemption_price as redemption_price, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT ca.attributes_id SEPARATOR ",") ) as attributes, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT ca.root_id SEPARATOR ",") ) as roots, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT ca.level SEPARATOR ",") ) as levels, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT cs.store_id SEPARATOR ",") ) as stores, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT uc.user_id SEPARATOR ",") ) as users, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT cs.state_id SEPARATOR ","), IF(online_coupon = 1, 0, null) ) as states, \ CONCAT_WS(',', IF( print_coupon = 1, 1,null), IF( mobile_coupon = 1, 2,null), IF( online_coupon = 1, 3,null) ) as types, \CONCAT_WS(',', GROUP_CONCAT(DISTINCT cs.postal_code SEPARATOR ",") ) as postal_codes_ids, \CONCAT_WS(' ', GROUP_CONCAT(DISTINCT cs.city_name SEPARATOR " ") ) as cities, \CONCAT_WS(' ', GROUP_CONCAT(DISTINCT s.road_name SEPARATOR " ") ) as roads, \CONCAT_WS(' ', GROUP_CONCAT(DISTINCT s.comercial_name SEPARATOR " ") ) as names, \CONCAT_WS(' ', GROUP_CONCAT(DISTINCT s.postal_code SEPARATOR " ") ) as postal_codes, \CONCAT_WS(' ', GROUP_CONCAT(DISTINCT sa.name SEPARATOR " ") ) as state_names \FROM ( ( ( (coupons c LEFT JOIN  coupon_attributes ca ON c.id = ca.coupons_id ) LEFT JOIN coupon_stores cs ON c.id = cs.coupon_id) LEFT JOIN sf_guard_user_coupons uc ON c.id = uc.coupon_id  ) LEFT JOIN stores s ON cs.store_id = s.id ) LEFT JOIN states sa ON cs.state_id = sa.id  LEFT JOIN companies cp ON cp.id=c.company_id \WHERE  ( c.administrative_status_id = 1 AND c.publish_at < NOW() AND DATE(c.valid_end_at) + INTERVAL 1439 HOUR_MINUTE > NOW() )  \GROUP BY c.id
Select, Joins e IndicesOptimizando Doctrine✔
VistasQuepodemosoptimizar
Optimizando Vistas
Inclusión de PartialsOptimizando Vistas
Listados y consultasanidadasOptimizando Vistas<?phpforeach($results as $plan): ?>	<li>	<?php echo $plan->get(“title”) ?> 	(<?php echo $plan->countAssistants()?> )</li><?phpendforeach; ?>Consultasanidadas
La CacheGuardemos en Cache parasalvaralgunos (muchos) milisegundos
La Cache
CómofuncionanLa Cache
CómofuncionanLa Cachela cache de de vistasfactories.ymlview_cache_manager:class: sfViewCacheManager    param:cache_key_use_vary_headers: truecache_key_use_host_name:    trueview_cache:class: sfFileCache    param:automatic_cleaning_factor: 0cache_dir:                 %SF_TEMPLATE_CACHE_DIR%      lifetime:                  86400      prefix:                    %SF_APP_DIR%/template
CómofuncionanLa Cachela cache de de Doctrine$manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver);$conn->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver);$q = Doctrine_Query::create() ->useQueryCache(new Doctrine_Cache_Apc()); $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE, $cacheDriver);$conn->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE, $cacheDriver);$manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE_LIFESPAN, 3600);->useResultCache(true);
CómomodificarlaLa Cachela cache de de vistas
CómomodificarlaLa Cachela cache de de vistasclass sfViewCacheManagerpublic function setPageCache($uri)public function getPageCache($uri)
CómomodificarlaLa Cachela cache de de vistasclass xyzCache extendssfCacheabstract public function get ($key, $default = null);abstract public function has ($key);abstract public function set ($key, $data, $lifetime = null);abstract public function remove ($key);abstract public function removePattern($pattern);abstract public function clean ($mode = self::ALL);
DriversLa Cache
OptimizandoSymfonyPodemoshaceralgo?
No mucho!
Quepodemoshacer?OptimizandoSymfonyDesabilitar TODO lo que no se USEHelpersLogsRouting CachePlugins que no usen100%
Una idea!
Front ControllerOptimizandoSymfonyrequire_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);sfContext::createInstance($configuration)->dispatch();
Front ControllerOptimizandoSymfonyrequire_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true);$manager = new sfDatabaseManager($configuration);$data = Doctrine::getTable(“Article”)->createQuery()->etc();$view = CMSProcess::ProcessData( $data );echo $view;
Gracias!
PreguntasAhora si las hacen Uds!
Miviejo amigojosetonyp@latizana.com@josetonypaotamao@latizana.com

Symfony 1, mi viejo amigo

Editor's Notes

  • #6 ----- Meeting Notes (02/07/11 00:31) -----COmo se que es un poco aburrido hablar de Sy1 pues les presento a Aotamao
  • #8 ----- Meeting Notes (02/07/11 00:21) -----Porque trabajamos con estoConocimiento comun de los problemas y posibles soluciones sobre el FWQuiero que sea una session corta
  • #9 Quiero saber queconocimientos hay sobresymofny 1.xCuantassaben de 1.x Cuantas personas No SabeSy 1.xQuien no sabe nada de Symofny 1.x?Entoncesqueaprenda S2 sin problemas.Cuantos con Doctrine 1.2?Cuantoshantenidoproblemasparalanzar la web porque les vamuy lento?
  • #12 ----- Meeting Notes (02/07/11 00:31) -----mejorar el uso de los recursos durante el proceso de la web
  • #13 ----- Meeting Notes (02/07/11 00:34) -----1)2) Rasum Lerdorf3) Creo yo, no se
  • #14 ----- Meeting Notes (02/07/11 00:34) -----conferencia la hago por mi experiencia preview
  • #16 ----- Meeting Notes (02/07/11 00:40) ----- vamos a ver a que nos enfrentamos
  • #18 ----- Meeting Notes (02/07/11 00:40) -----Nos enfrentamos a mejorar estas cosas, son inaceptables sin cache
  • #29 ----- Meeting Notes (02/07/11 01:03) -----Que buscamos en la DBPara que vamos a la DBUtilizamos doctrine para describir esas busquedas con su DQL, mala idea
  • #30 PHP Data ObjectsThe PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP.PDO provides a data-access abstraction layer, which means that, regardless of which database you&apos;re using, you use the same functions to issue queries and fetch data.ABSTRACTION !!!
  • #32 Quedarse con esto en la mente, se puederecupearalasconeccionque no es mas queuna extension de PDO y usarseparallegar a la DB
  • #37 Cuidado con los JoinsEstas queries esmejorcachearlassi no se van a podermejorar
  • #39 Quien no sabe nada de Symofny 1.x?Entoncesqueaprenda S2 sin problemas.Cuantostienesquevolver el lunes a trabajar con sy 1.x?Cuantos con Doctrine 1.2?Cuantoshantenidoproblemasparalanzar la web porque les vamuy lento?
  • #45 Cuestion de reducir los includes y revisarlasconsultasanidadas: Dondeaquipresento 2 ejemplos----- Meeting Notes (02/07/11 01:26) -----No PartialNo Lo Otro
  • #46 Partial reconstruye el objetoPHPView Con nuevasvariablesPor favor no lo diganporahi
  • #47 Añadir el join con la tablaEvenAssistantsPonerlímtes a la queryCrear Index para MySQLSeleccionar solo los camposnecesariosContar en otra query y usaruna variable nueva
  • #48 La cache vino a salvarnos la vida, sin ellamuchas app no salen a producción, vamos a verquepodemoshacer con ella
  • #50 Empecemosdesde el principio
  • #52 Esmuchainformacion, solo saber que se puededefinir a nivelconexion y a nivel manager.
  • #64 Quien no sabe nada de Symofny 1.x?Entoncesqueaprenda S2 sin problemas.Cuantostienesquevolver el lunes a trabajar con sy 1.x?Cuantos con Doctrine 1.2?Cuantoshantenidoproblemasparalanzar la web porque les vamuy lento?