Archives for Desarrollo

Cache en PHP – Simple y eficiente

Cuando trabajamos php hechos desde cero, la velocidad puede ser a menudo un problema. El almacenamiento en caché es de gran utilidad para acelerar páginas. En este artículo te mostraré una manera muy fácil y eficiente para almacenar en caché de forma dinámica las páginas PHP que necesitan para ser más rápido.

Primer Paso

Tenemos que crear dos archivos.

El primero llamado top-cache.php que debe contener el siguiente código:


<?
$url = $_SERVER["SCRIPT_NAME"];
$break = Explode('/', $url);
$file = $break[count($break) - 1];
$cachefile = 'cached-'.substr_replace($file ,"",-4).'.html';
$cachetime = 300; // valor en segundos

if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n";
include($cachefile);
exit;
}
ob_start();
?>

¿qué hace este código? 

Las primeras 5 líneas crean el nombre del archivo en caché según el archivo php actual. Por lo tanto, si estás usando un archivo llamado list.php , el archivo almacenado en caché se denomina cached-list.html .

La línea 6 crea una variable $cachetime que determina la vida del caché.

Las líneas 9 y 13 son una sentencia condicional que busqua un archivo llamado $cachefile . Si no se encuentra el archivo, se inserta un comentario (línea 10) y el archivo $cachefile se incluye. Entonces, la declaración exit detiene la ejecución de la secuencia y el archivo se envía al cliente. Lo que significa que si no se encuentra el archivo estático, ningún código php es interpretado por el servidor.

Segundo Paso

Ahora, creá un segundo archivo php, llamado bottom-cache.php y peguá el código de abajo.


<?
$cached = fopen($cachefile, 'w');
fwrite($cached, ob_get_contents());
fclose($cached);
ob_end_flush();
?>

Si el archivo llamado $cachefile no se encuentra en el servidor, el código se ejecuta y crea el archivo, así que la próxima vez que la página sea llamada, el archivo $cachefile estático será servido al navegador del cliente en lugar de ejecutar todo el PHP.

Tercer Paso

Ahora que creaste los dos archivos necesarios, simplemente tenés que incluirlos en la página php que queres cachear. Como habrás adivinado, la página top-cache.php debe ser incluida en el comienzo de tu página php y la página bottom-cache.php al final, como se muestra a continuación:


<? include('top-cache.php'); ?>

Tu codigo aquí....

<? include('bottom-cache.php'); ?>

Ahora bien, si probás el caché en una página lenta, te sorprenderás de lo rápido que la página es. Este caché fácil es mi solución preferida cuando se trabaja “desde cero” en sitios web en PHP.

Espero lo apliquen.

Redimensionar una imagen en PHP

Este es un mecanismo que utilizamos constantemente y cada vez que lo necesitamos recorremos algunas webs para encontrar la forma mas rápida y que se adapte a nuestro desarrollo.
Hoy les voy a mostrar una forma muy simple de poder cambiar el tamaño de una imagen con muy poco código y utilizando la librería GD que por lo general está preinstalada en todos los hostings.

//Ruta de la imagen original
$rutaImagenOriginal="./imagen/aprilia classic.jpg";
$img_original = imagecreatefromjpeg($rutaImagenOriginal);
//Defino los valores maximos
$max_ancho = 200;
$max_alto = 200;
//Tomo el valor original de la imagen
list($ancho,$alto)=getimagesize($rutaImagenOriginal);
$x_ratio = $max_ancho / $ancho;
$y_ratio = $max_alto / $alto;

Determinamos la proporción de la imagen

if( ($ancho <= $max_ancho) && ($alto <= $max_alto) ){//Si ancho
$ancho_final = $ancho;
$alto_final = $alto;
}

elseif (($x_ratio * $alto) < $max_alto){
$alto_final = ceil($x_ratio * $alto);
$ancho_final = $max_ancho;
}

else{
$ancho_final = ceil($y_ratio * $ancho);
$alto_final = $max_alto;
}

Ahora redimensionamos la imagen

$tmp=imagecreatetruecolor($ancho_final,$alto_final);
imagecopyresampled($tmp,$img_original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);
imagedestroy($img_original);

Ahora guardamos la imagen y la mostramos en pantalla.

$calidad=95;
imagejpeg($tmp,"./imagen/retoque.jpg",$calidad);
Header("Content-type: image/jpeg");
imagejpeg($tmp);

Espero les sirva. Recuerden, contesto todos los comentarios.