PageSpeed : Truco para subir nota

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.

Unificar los ficheros Javascript y CSS

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");

?>