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
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
ó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
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
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);
– 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
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);
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); } }
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; }
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(); ?>
• 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;
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