May 13th, 2010 Category: Optimizing Zend Framework
10 Comments »

Puff hace mucho no escribo nada mi nuevo proyecto (http://www.dondejugarpaintball.com) Me esta llevando todo mi tiempo libre.

Voy a mostrarles como implementar de forma simple dos tips de velocidad para tus paginas, el primero es gzip, la idea es que toda la salida de nuestra aplicacion al browser no tenga espacios inecesarios, tabulaciones, y saltos de lineas, en pocas palabras, si vemos el codigo fuente de nuestro sitio vamos a ver solo una linea con todo el contenido html, como pueden ver en http://www.dondejugarpaintball.com. Esto es muy util para ahorrarnos ancho de banda, y obviamente aumentar la velocidad con la que se descarga nuestro contenido.

Esto a simple vista pareceria ser un trabajo de horas, pero como nosotros usamos Zend Framework y toda la info de nuestra aplicacion pasa por nuestro public/index.php con solo editar este archivo podemos conseguir esta mejora en segundos.

Si tienen un archivo index.php standar sin modificaciones, puden copiar y pegar este codigo y es suficiente.

//Con esta linea le indicamos que queremos obtener toda la salida generada
ob_start();
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
            realpath(APPLICATION_PATH . '/../library'),
            get_include_path(),
        )));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();
$application->run();

// A partir de esta linea conseguimos toda la salida generada y la comprimimos
$cntACmp =ob_get_contents();
ob_end_clean();
$cntACmp=str_replace("\n",' ',$cntACmp);
$cntACmp=ereg_replace('[[:space:]]+',' ',$cntACmp);
ob_start("ob_gzhandler");
echo $cntACmp;
ob_end_flush();

Si guardan y ejecutan su aplicacion, ya tendrian que tener todo su contenido html en una sola linea.

El segundo tips, ya requiere un poco mas de conocimeintos sobre apache.
La idea es que cada vez que alguien pida un contenido estatico como una imagen, o css el apache responda lo mas rapido posible, esto se hace diciendole que nuestro contenido tiene una fecha de expiracion x, y por lo tanto si esa fecha no vario, hay que entregar el mismo contenido que se entrego anteriormente, esto reduce mucho los recursos de nuestro sistema para entregar un contenido estatico. Podemos definir tiempos para cada extension.

Para realizar este cambio necesitamos saber si tenemos el modulo expire de Apache activado.

En caso contrario entramos como sudo y escribimos

sudo a2enmod expire

Reiniciamos apache

/etc/init.d/apache2 reload

Y ya queda activado.

Despues de confirmar que el modulo expire esta activado, editamos nuestro archivo public/.htacces, y agregamos las lineas correspondientes.

#empezamos a definir los tiempos de expiracion de cada contenido
ExpiresActive On
ExpiresDefault A0
ExpiresByType image/gif A25920000
ExpiresByType image/png A25920000
ExpiresByType image/jpg A25920000
ExpiresByType image/jpeg A25920000
ExpiresByType text/css A25920000
ExpiresByType text/javascript A259200000

#estas son nuestras directivas por default
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Invitame una Cerverza


Comentar


10 Responses

El Barto 2010-05-13 14:09:15
Y el gzip bien gracias...

Para poner gzip agregá en el .htaccess esta línea:
SetEnv gzip 1

Pablo Morales 2010-06-02 11:24:02
El Gzip, lo manejo con PHP. FIjate en el codigo del index.php

El Barto 2010-06-02 11:40:04
1 - A menos que vayas a procesar con PHP todos los JS y CSS (y cualquier otro archivo de texto), necesitarías ponerlo en el .htaccess
2 - Seguís teniendo el problema de la definición de gzip al principio del artículo :P

Pablo Morales 2010-06-02 11:43:18
Los css y js, siempre ya los comprimo, con el codigo de tu blog, no me acuerdo el post pero anda por ahi.

El Barto 2010-06-02 11:44:22
Mmm el código de mi blog era para cachearlo, no para comprimirlo.

El Barto 2010-06-02 11:48:21
Por cierto, deberías arder en el infierno por siempre por usar ereg_replace!!!!
Las funciones ereg_* si no están deprecadas en PHP 5.3 en cualqueir momento lo van a estar y para PHP 6, supuestamente, iba a haber que habilitarlas especialmente. preg_* para toda la vida.


Probá con:
$cntACmp = preg_replace('/\s+/',' ',$cntACmp);

Pablo Morales 2010-06-02 11:49:49
El gzip queda activado con las lineas que puse en el index.php podes verlo en dondejugarpaintball.com

los css, imagenes, y js los manejo con google apps, y el hace la magia, eso me libera el servidor. y uso google app con CMDN (o como sea)

Pablo Morales 2010-06-02 11:50:55
hehehehe, depreco en la 5.3 el ereg pero, que queres que haga, si vas a php.net/ereg_replace no te dice con que reemplazarla.

El Barto 2010-06-02 11:51:56
Sí te dice, mirá más abajo:

Note: As of PHP 5.3.0, the regex extension is deprecated in favor of the PCRE extension. Calling this function will issue an E_DEPRECATED notice. See the list of differences for help on converting to PCRE.

Tip

preg_replace(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg_replace().

Pablo Morales 2010-06-02 11:53:41
Bueno che, voy a tener que cambiarlo en mi sistema.