{"id":1567,"date":"2016-09-06T13:29:14","date_gmt":"2016-09-06T13:29:14","guid":{"rendered":"http:\/\/eaprende.com\/blog\/?p=1567"},"modified":"2016-09-06T13:59:29","modified_gmt":"2016-09-06T13:59:29","slug":"tecnicas-de-cache-en-php","status":"publish","type":"post","link":"https:\/\/www.eaprende.com\/blog\/2016\/09\/06\/tecnicas-de-cache-en-php\/","title":{"rendered":"T\u00e9cnicas de cach\u00e9 en php"},"content":{"rendered":"<blockquote><p>En este caso mi intenci\u00f3n era comprobar la mejora real utilizando un peque\u00f1o script PHP para generar un archivo de cach\u00e9 mediante c\u00f3digo, aunque existen maneras y maneras, prometo ir analizando varias otras opciones en el transcurso de siguientes entradas.<\/p><\/blockquote>\n<p>El objetivo es crear archivos HTML \u201cpuros\u201d a partir de scripts PHP que podr\u00edan contener: largos y complejos procesos, consultas a base de datos, etc.; pero que una vez creado el contenido no necesita la generaci\u00f3n del mismo constantemente. Si necesitamos que el contenido sea 100% en tiempo real el cach\u00e9, en este caso, no es recomendable ni \u00fatil, la intensi\u00f3n es \u201ccachear\u201d p\u00e1ginas con contenidos que pueden de alguna u otra manera tardar N segundos en refrescarse dicho contenido. Al generar archivos HTML estamos protegiendo el desgaste de los recursos del servidor, y obviamente optimizamos el rendimiento general: recursos m\u00e1s resultados, enti\u00e9ndase que al consumir directamente HMLT estar\u00edamos con: menos consultas a Base de datos, menos procesos, etc.<\/p>\n<blockquote><p><em>Pero c\u00f3mo optimizar algo sin una m\u00e9trica inicial?<\/em><\/p><\/blockquote>\n<p>Bueno, eso mismo es lo que tenemos que hacer, medir primeramente el tiempo de ejecuci\u00f3n de un script sin cache, puede ser toda una p\u00e1gina (enti\u00e9ndase que nos referimos al documento individual pues, muchas personas se podr\u00edan referir err\u00f3neamente como p\u00e1gina a un sitio) o parte del script en realidad.<\/p>\n<p>Para medir utilic\u00e9 el siguiente c\u00f3digo<br \/>\n<code><br \/>\n&lt;?php<br \/>\n$comienzo= microtime(true); \u00a0\/\/al inicio del archivo<br \/>\n?&gt;<br \/>\n<\/code><\/p>\n<p>Luego viene todo el c\u00f3digo PHP, HTML, etc.<\/p>\n<p>Y al final colocamos esto.<\/p>\n<p><code><br \/>\n&lt;?php<\/code><\/p>\n<p>\/*\u2014\u2014\u2014\u2014\u2014-Fin C\u00f3digo\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013*\/<\/p>\n<p>$final= microtime(true); \u00a0\/\/al final del archivo<\/p>\n<p>echo \u00a0\u00abTiempo: \u00ab. number_format($final-$comienzo,4).\u00bb \u00a0segundos.\u00bb;<\/p>\n<p>?&gt;<\/p>\n<p>Ahora tendremos documentado el tiempo de ejecuci\u00f3n, debemos guardar esa informaci\u00f3n.<\/p>\n<p>Seguidamente crearemos dos nuevos archivos.<\/p>\n<p><strong><em>top_cache.php<\/em><\/strong><br \/>\n<code><br \/>\n&lt;?php<\/code><\/p>\n<p>$comienzo= microtime(true); \/\/al inicio del archivo<\/p>\n<p>$url = $_SERVER[\u00abSCRIPT_NAME\u00bb]; \/\/obtenemos el nombre la url y nombres de archivo actual<\/p>\n<p>$break = explode(&#8216;\/&#8217;, $url); \/\/dividimos las uniones por \/ y obtenemos una matriz de datos<\/p>\n<p>$file = $break[count($break) &#8211; 1]; \/\/obtenemos el nombre real del archivo<\/p>\n<p>&nbsp;<\/p>\n<p>$cachefile = &#8216;cached-&#8216;.substr_replace($file ,\u00bb\u00bb,-4).&#8217;.html&#8217;; \/\/creamos un nombre nuevo para el cach\u00e9, este ser\u00e1 HTML para optimizar recursos<\/p>\n<p>$cachetime = 900; \/\/seteamos el tiempo de duraci\u00f3n de la cach\u00e9 en segundos | 900\/60 = 15 minutos<\/p>\n<p>\/\/ Servir desde la cache si es m\u00e1s actual que $cachetime<\/p>\n<p>if (file_exists($cachefile) &amp;&amp; time() &#8211; $cachetime &lt; filemtime($cachefile)) {<\/p>\n<p>echo \u00ab&lt;!&#8211; Copia en cache generada \u00ab.date(&#8216;H:i&#8217;, filemtime($cachefile)).\u00bb &#8211;&gt;\\n\u00bb;<\/p>\n<p>include($cachefile);<\/p>\n<p>$final= microtime(true); \/\/al final del archivo<\/p>\n<p>echo \u00ab&lt;div&gt;Nuevo tiempo: \u00ab. number_format($final-$comienzo,4).\u00bb segundos.&lt;\/div&gt;\u00bb;<\/p>\n<p>exit;<\/p>\n<p>}<\/p>\n<p>ob_start(); \/\/ Crear buffer de salida<\/p>\n<p>?&gt;<\/p>\n<p><strong><em>bottom_cache.php<\/em><\/strong><br \/>\n<code><br \/>\n&lt;?php<\/code><\/p>\n<p>\/\/ Cachear el contenido del fichero<\/p>\n<p>$cached = fopen($cachefile, &#8216;w&#8217;); \/\/toma el nombre del archivo cach\u00e9 que creamos en topo_cache si no existe o si ya pas\u00f3 su vida \u00fatil<\/p>\n<p>fwrite($cached, ob_get_contents()); \/\/escribe todo el contenido del archivo actual<\/p>\n<p>fclose($cached);<\/p>\n<p>ob_end_flush(); \/\/ Enviar el navegador<\/p>\n<p>?&gt;<\/p>\n<p>Este archivo top_cache.php debo incluirlo en la primera l\u00ednea de mi p\u00e1gina a \u201ccachear\u201d y bottom_cache.php al final.<\/p>\n<p><code><br \/>\n&lt;?php \u00a0include \"top_cache.php\"; ?&gt;<\/code><\/p>\n<p>Aqu\u00ed va el c\u00f3digo PHP, HTML, css, etc.<br \/>\n<code><br \/>\n&lt;?php include \"bottom _cache.php\"; ?&gt;<br \/>\n<\/code><br \/>\n<em>En mis pruebas se not\u00f3 la mejor\u00eda a un 50% pero extra\u00f1amente reci\u00e9n a partir de la tercera llamada a la p\u00e1gina; otra cosa que no me funcion\u00f3 es cuando existe paginaci\u00f3n de por medio pues, esto est\u00e1 basado en el nombre del archivo y cuando es paginaci\u00f3n, el nombre de la p\u00e1gina sigue siendo la misma solo cambian los par\u00e1metros, a no ser que usemos url amigables en cuyo caso cada paginaci\u00f3n podr\u00eda ser un nombre distinto (veremos url amigables en otras entradas)<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este caso mi intenci\u00f3n era comprobar la mejora real utilizando un peque\u00f1o script PHP para generar un archivo de cach\u00e9 mediante c\u00f3digo, aunque existen maneras y maneras, prometo ir analizando varias otras opciones en el transcurso de siguientes entradas. El objetivo es crear archivos HTML \u201cpuros\u201d a partir de scripts PHP que podr\u00edan contener: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1578,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/posts\/1567"}],"collection":[{"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/comments?post=1567"}],"version-history":[{"count":9,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/posts\/1567\/revisions"}],"predecessor-version":[{"id":1579,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/posts\/1567\/revisions\/1579"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/media\/1578"}],"wp:attachment":[{"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/media?parent=1567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/categories?post=1567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.eaprende.com\/blog\/wp-json\/wp\/v2\/tags?post=1567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}