Optimizar tu aplicación web PHP – Parte 1

Hace tiempo escribí un artículo sobre como hacer que el código javascript se cargue de forma más rápida, y también el uso de memcache para optimizar la petición de consultas a la base de datos y hoy quiero empezar la primera parte de dos o quizás tres secciones de un artículo con consejos para optimizar tu aplicación web hecha en PHP.

Cuando me refiero a optimizar significa a que nuestras aplicaciones básicamente sean más rápidas ya sean usando menos memoria o menos procesos, lo primero que quiero es desmentir el mito que dice «una aplicación es optima que otra si usa menos líneas de código», eso es falso… quizás en algunas ocasiones aplique pero no siempre es así.

Ahora, como decía antes, hay varios aspectos a optimizar en una aplicación, trataré de dar consejos para los siguientes 3 aspectos optimizables dentro de cualquier programa o fragmento de código:

  1. Cantidad de líneas de código
  2. Consumo de memoria
  3. La velocidad en que se ejecuta (uso de procesador)

A mi criterio, los dos últimos puntos son los más importantes, estos dos determinan si un algoritmo es optimo o no, pero la cantidad de líneas de código no determina que tan optimo es un algoritmo. Ahora, si ayuda a la optimización porque cada línea de código significa una instrucción o instrucciones más para el procesador.

Mis consejos son:

  1. Tratar de no usar variables globales a menos que sea necesario. PHP siempre tiene que comprobar que existen.
  2. Es mejor no introducir código html dentro de PHP.Es más rápido usar
    Texto aquí

    que usar

    echo "Texto aquí"
  3. No declares variables que no usarás, estoy utilizaría memoria innecesaria
  4. La función require_once es lenta, así que en lo posible no la uses
  5. Siempre que puedas declarar un método o variable como estática, hazlo!
  6. Si vas a escribir en disco duro, trata de no hacerlo fragmento por fragmento sino todo de un solo golpe, quizás sacrifiques un poco de memoria RAM pero ganas rendimiento en velocidad, esto debido a que es más rápido acceder a memoria RAM que al disco duro… es necesario analizar bien el caso para saber como aplicarlo.
  7. Los ciclos o bucles consumen gran cantidad de procesamiento en la CPU, así que si puedes aplicar un poco de matemáticas discretas seguramente el procesador te lo agradecerá.
  8. Hay que calcular el tamaño de un arreglo antes de un ciclo, sino cada vez que se ejecuta el ciclo se tendrá que calcular el tamaño del arregloMal:
    for($i=1;$i<=sizeof($arreglo);$i++)

    Bien:

    $tamano=sizeof($arreglo);
    for($i=1;$i<=$tamano;$i++)
  9. Esconder los errores con @ es muy lento
  10. Utiliza pocos accesos a la base de datos
  11. Cuando hagas una consulta a la base de datos, no traigas campos innecesarios. No utilices «SELECT * FROM tabla» si no lo necesitas, utiliza «SELECT campo, campo FROM tabla».
  12. La programación orientada a objetos es muy útil cuando nuestro programa es grande y nos permite reutilizar código, por tanto tener menos líneas de código fuente

Bueno, estos son apenas unos cuantos consejos que doy de mi experiencia, quizás aún tu aplicación no sea optima pero seguro que estos consejos ayudarán a que el rendimiento mejore mucho.

Pronto escribiré otra tanda de consejos para que tu aplicación en php sea mas optima.

    Memcache + PHP

    ¿Por qué memcache?
    En muchos proyectos de software (incluyendo Web) se realizan consultas a la base de datos que un lapso de tiempo siempre arrojan el mismo resultado; pero como no teníamos con una forma de almacenar esa información para disponer de ella cada vez que la necesitamos sin tener que realizar la consulta en el motor de bases de datos nuevamente, entonces simplemente llamábamos un query X cantidad de veces sin importar los recursos que tomaba la ejecución de dicha consulta. Con el fin de evitar ese desperdicio de recursos es que ha nacido memcache.

    ¿Qué es memcache?
    Memcache es un servicio para almacenar objetos en memoria RAM y que pueden ser utilizados por múltiples procesos sin importar si se encuentran en la misma máquina o no. El objetivo principal por el que surgió memcache es el de evitar peticiones incesarías a la base de datos.

    ¿Cómo lo instalo y configuro?
    Para unix:
    $ sudo apt-get install memcached
    $ sudo /etc/init.d/memcached restart
    $ sudo apt-get install php5-memcache

    Activar la extensión editando el archivo /etc/php5/conf.d/memcache.ini y descomentando la línea extension.
    ; uncomment the next line to enable the module
    extension=memcache.so

    Por último reiniciar apache

    Para Windows:
    Bajar e instalar: http://allegiance.chi-town.com/MemCacheDManager.aspx

    Activar la extensión editando el archivo  G:\wamp\bin\php\php5.2.6\php.ini  y descomentando la línea extension.
    extension=php_memcache.dll

    Por último reiniciar apache

    Memcache es un servicio/daemon que se ejecuta por consola de la siguiente manera:

    /usr/bin/memcached -d -m 2048 -u root
    -d : corre como servicio.
    -m : limite de memoria en MB que le permitiremos usar a memecache
    -u : identidad de quien ejecuta el proceso
    -p : puerto (por default es 11211)
    -c : limite de conexiones simultaneas (default es 1024)
    -h : muestra ayudas y otros parámetros de uso

    ¿Cómo lo uso?

    function memcache_test(){
       $memcache = new Memcache();
       $memcache->connect("localhost",11211);
       $key = "todos_los_registros_de_tabla_datos";
       $datos = $memcache->get($key);
       if (!$datos){
          echo "No esta cachado... hitting db e insertando en  memcache. <br>";
          $result = mysql_query("SELECT * FROM datos");
          while( ($dato=mysql_fetch_assoc($result))!=null){
             $datos[]=$dato;
          }
          $memcache->set($key,$datos,false,60*60*24); //cachados  por 24 horas
          print_r($datos);
       }else{
          echo "Ya se encuentra en memoria:<br>";
          print_r($datos);
       }
    }

    Gracias luis por la info

    Optimizar las páginas javascript con PHP

    Hace un par de días estuve hablando con miembros de mi equipo de trabajo sobre ¿Cómo hacer que una web cargue mas rápido?, hoy he leído un artículo sobre un colega (Alexis Cardenas) en donde habla sobre como optimizar las webs a manera de código que básicamente se fundamentaban en dos cosas:

    • Hacer código javascript mas optimo, reducido, etc…
    • Hacer que la programación en php sea optima igualmente

    Ahora yo quiero mostrar herramientas adicionales para hacer que un sitio cargue mucho más rápido.

    1. Utilizar algun compresor para el código javascript, el más popular es YUI Compressor pero en la web hay una gran lista de ellos, aquí dejo el nombre de algunos otros importantes: Packer, Crunchy, JSCruncher, Dojo ShrinkSafe
    2. Para comprimir una página web donde puedes ejecutar PHP colocas al inicio del archivo:
      <?php ob_start(«ob_gzhandler»); ?>
      y luego, despues de cualquier codigo PHP ponemos: <?php ob_end_flush(); ?>
    3. Para el CSS y el JAVASCRIPT, en el archivo .htaccess agregamos lo siguiente:
      AddHandler application/x-httpd-php .css .js php_value auto_prepend_file /home/… RUTA LOCAL …/public_html/gzip-start.php php_value auto_append_file /home/… RUTA LOCAL …/public_html/gzip-end.php
      En el archivo gzip-start.php ponemos: <?php ob_start(«ob_gzhandler»); ?>
      y en el archivo gzip-end.php ponemos: <?php ob_end_flush(); ?>

    Esto ayuda al tiempo de carga debido a que ahorrando tiempo al transferir los archivos se ahorran recursos de CPU y RAM y al transferir menos información el cliente puede mostrar la web mucho mas rápido.