A pesar de que las conexiones son cada día más rápidas, últimamente se está mirando mucho algunos aspectos que agilicen la carga de las páginas.
Se requiere que sean transferidos comprimidos, en su defecto recomiendan que los minimices. A parte, para reducir el número de peticiones, solicitan que los combinemos en un solo fichero, pero claro, no todas las páginas usan los mismos scripts y ahí es donde llega mi truco-sugerencia, utilizar un PHP que bajo demanda combine los scripts que necesitamos.
Vamos a separar los nombres de los ficheros que se necesiten con guiones, aunque podría utilizarse algún otro símbolo como la barra «/» si os incomoda esta limitación en vuestros nombres de fichero. El script PHP recibirá el listado en el parámetro «files» así como otro parámetro «ext» indicando si se trata de ficheros javascript o css (para adaptar la cabecera «Content-Type»).
Creamos un fichero «index.html» que hará llamadas a los script y estilos.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>PageSpeed : Truco para subir nota</title> <link rel="stylesheet" type="text/css" href="csi/common.css" /> <script type="text/javascript" src="csi/jquery-home.js"></script> </head> <body> </body> </html>
Ahora hacemos un fichero .htaccess que dirija las peticiones de ficheros .js o .css al script PHP. Siempre me ha gustado usar la carpeta «csi» (client side include).
RewriteEngine on RewriteRule ^csi/([\w-]+)\.js$ /csi/joiner.php?files=$1&ext=js RewriteRule ^csi/([\w-]+)\.css$ /csi/joiner.php?files=$1&ext=css
El script en PHP que unifica los ficheros esencialmente tiene que hacer un include por cada uno, pero para hacer bien el trabajo vamos a obtener la última fecha de modificación ($lv significa last version) y vamos a recordar cuál es el más joven ($jgr significa junger y está inicializado con la fecha de mi nacimiento, tu puedes poner la tuya) y así devolveremos al navegador la cabecera «Last-Modified». Por la misma razón, para hacer bien el trabajo, vamos a comprobar si el navegador tenía una versión en caché y nos ha indicado la fecha de ésta. Si fuera la misma que vamos a indicar, consideramos que esa copia es válida y por tanto no vamos a enviarle lo mismo que tiene por eso limpiamos el buffer de PHP, introducimos el código de respuesta 304 y abortamos la ejecución del script.
<? $ext = $_GET["ext"]; $files = $_GET["files"]; $files = split("-", $files); if($ext=="js") header("Content-Type: application/javascript"); elseif($ext=="css") header("Content-Type: text/css"); $jgr = mktime(0,0,0,25,2,1977); foreach($files as $file) { $lv = filectime("{$file}.{$ext}"); $jgr = max($jgr, $lv); include("{$file}.{$ext}"); } $ah = getallheaders(); if($ah["If-Modified-Since"]) { $lv = str2time($ah["If-Modified-Since"]); if($lv==$jgr) { ob_clean(); header("Status: 304 Not modified"); die(); } } header("Last-Modified: ".gmdate("D, d M Y H:i:s", $jgr)." GMT"); ?>