Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WordPress Tunning - Cacheo - MindCamp 3.0

Kartones
November 24, 2011

WordPress Tunning - Cacheo - MindCamp 3.0

@ MindCamp 3.0 (March 2011)

Kartones

November 24, 2011
Tweet

More Decks by Kartones

Other Decks in Programming

Transcript

  1. • Developer de C# de corazón • Y de PHP

    por oficio • http://personalportfolio.kartones.net Intro
  2. • Practicar algo de PHP que no sea de trabajo

    en casa • Ver si WP es tan malo por dentro como parece (nadie dice que no funcione bien por fuera) • Ver qué tal se puede optimizar sin tocar por dentro • Ver qué sistemas de cacheo hay, y probablemente montarme el mio propio para practicar un poco Motivación
  3. • Documentación oficial de WP bastante buena, aunque incompleta! •

    Referencia de funciones vital • El código fuente se deja leer sin problemas • Solo mirando la documentación oficial * * Trampa: Sacar el Post ID en una Page no venía en la web oficial… Research - Fuentes oficiales
  4. • WP-Cache: Obsoleto • WP Super Cache: Para un rendimiento

    óptimo necesitas Linux, cachea todo el HTML * • W3 Total Cache: Enorme, overkill si no está bien configurado * • DB Cache: Obsoleto. Buena idea pero busco cacheo estilo ASP.NET (a nivel de “controles”). • HyperCache: Cachea todo el HTML, por lo demás la opción más apetecible. * Algunos Hosting providers no permiten su uso. Research - Plugins Existentes
  5. • Evitar acceder a la capa de datos (BBDD normalmente)

    todo lo posible • Y cuando se acceda, aprovechar para cachear los datos • Aplicable a muchas cosas: Resultados de querys, serializado de objetos, listas, o directamente fragmentos de HTML • Máx. querys a la BBDD (en este escenario): 2 1. Consultar existencia+fecha cacheo de key 2. Obtener datos si hay un miss o el cacheo ha expirado Research - Cacheo 101
  6. • Pocas líneas de código • Ligero y Rápido •

    No modificar más allá de plugins/themes • Cacheo de contenido: Yo controlo qué se cachea • Disk storage: Rápido para lectura • Código limpio y fácil de usar: Aproximación $recentPosts = $cache->Get(Kache::CACHE_KEY_SIDEBAR); $cache->Set(Kache::CACHE_KEY_SIDEBAR, $recentPosts); $cache->Invalidate(Kache::CACHE_KEY_SIDEBAR);
  7. • Contenido a cachear: – Recent Posts de la Sidebar

    – Homepage – Pages (posts estáticos/fijos) * • Eventos para inserción/refresco de la cache: – Key no cacheada (‘miss’) o expirada – Posts (nuevo, modificado contenido, borrado) – Comentarios (nuevo o borrado de existente) * Fácilmente replicable en posts Aproximación
  8. • WP: update_option() y get_option() – Campos extra en la

    BBDD de forma sencilla • Almacenaje: – DB: Timestamp de última inserción de key de cache – Files: Contenido de key de cache • Soporte de sub-keys: array(clave => timestamp) – Ejemplo: Desarrollo $kache->Get(Kache::CACHE_KEY_PAGES, $postID); $kache->Set(Kache::CACHE_KEY_PAGES, $content, $postID);
  9. • Bastante simple en la práctica: • StoreContents() guarda en

    archivos Desarrollo - Kache public function Refresh($cacheKey) { update_option($cacheKey, time()); } public function Invalidate($cacheKey) { update_option($cacheKey, false); } public function Set($cacheKey, $cacheContent, $arrayKey = null) { if ($this->StoreContents($cacheKey, $cacheContent, $arrayKey)) { $this->Refresh($cacheKey); } }
  10. • Lógicamente la consulta de expiración y E/S de datos

    tiene más código… • GrabContents() lee de archivos Desarrollo - Kache public function Get($cacheKey, $arrayKey = null) { $content = false; $lastTime = get_option($cacheKey); if ($lastTime) { if (!self::$keysConfig[$cacheKey][0]) { $lastTime = (int) $lastTime; if (time() - $lastTime <= self::$keysConfig[$cacheKey][1]) { $content = $this->GrabContents($cacheKey); } } else { // Cast to array of key=>value … } } return $content; }
  11. • Orientado a objetos, pero como WP no… Desarrollo -

    Kache function InvalidatePagesCache() { $kache = Kache::GetInstance(); $kache->Invalidate(Kache::CACHE_KEY_PAGES); } function InvalidateAllKache() { $kache = Kache::GetInstance(); $kache->InvalidateAll(); } add_action ('publish_post', 'InvalidateAllKache'); add_action ('deleted_post', 'InvalidateAllKache'); add_action ('post_updated', 'InvalidateAllKache'); add_action ('comment_post', 'InvalidatePagesCache'); add_action ('deleted_comment', 'InvalidatePagesCache');
  12. • Nomenclatura y output caótico de funciones: – Echo por

    defecto + parámetro para retornar: – Diferente función para echo y para retorno: – Nombres incongruentes: – Y a veces ni hay función de retorno Desarrollo - WP 3.0 the_title_attribute('echo=0'); the_ID(); get_the_ID(); foreach((get_the_category()) as $category) { … } <?php comments_template(); ?>
  13. • Tiempo de carga: de 2-5 seg a 0,5-0,7 seg

    • Ficheros de cache: 3-10 KB c/u (depende del theme) • Solo 3 rows nuevas en la tabla wp_options • Hay que modificar los themes para cachear :( Resultados $kache = Kache::GetInstance(); $content = $kache->Get(Kache::CACHE_KEY_PAGES, $postID); if (!$content) { $content = ''; $content .= '<div id="container"><div id="main">'; … echo $content;
  14. • WP mejora con el tiempo pero sigue siendo desastroso

    por dentro • KISS: Keep It Simple, Stupid! • Pequeños cambios -> grandes mejoras • Cacheo = Mejora concreta < mejoras posibles – Plugins no usados o sin optimizar – Paso de literales a hardcoded text – Desactivado de eventos de WP – Optimizaciones de configuración de PHP – … Conclusión
  15. PPTX y código a la vuelta de la MindCamp en

    http://kartones.net/files/ ¿Quieres ver y programar PHP del bueno? http://jobs.tuenti.com ¡Gracias por vuestro tiempo! ¿Dudas, preguntas...?