Recomendaciones para programar en PHP

En PHP Benchmark hacen algunas pruebas de eficiencia con respecto a funciones similares de PHP. A continuación voy a hacer un breve repaso, con algunos añadidos:

  • Usar HTML ante PHP: Si necesitas escribir HTML hazlo directamente sin utilizar echo o print. Usa PHP para imprimir información sólo cuando sea necesario.
  • Variables: Favorece siempre que puedas el uso de variables estáticas. No utilices variables que no necesites (ocupan memoria). Evita las variables globales en la medida de lo posible. Usa constantes.
  • Unset: Utiliza la función unset para destruir variables y liberar memoria, sobre todo con arrays o variables extensas. PHP usa un Garbage Collector, pero en mitad de un script puedes usarlo para maximizar la memoria disponible (útil en servidores limitados).
  • Bucles: Revisa bien los bucles en tus programas, si no es necesario un bucle, evitalo. Si puedes ahorrarte ciclos, hazlo. Comprueba la condición de parada y nunca uses funciones en ella (vuelca en una variable antes del bucle). En términos de velocidad un do..while es más rápido que un while, que a su vez es más rápido que un for.
  • Inclusiones: Organiza bien tu código y evita en lo posible el uso de funciones como include_once() y require_once(). Estas funciones son muy utiles para comprobar si un script ya ha sido procesado, pero son muy costosas. En su lugar utiliza include() y require().
  • Supresión de errores @: Al colocar una @ antes de una función evitamos que se muestre un posible mensaje de error. Muy útil, pero muy costoso. Es preferible utilizar un funcion() or ....
  • Random: Si queremos generar valores aleatorios con la función rand(), es recomendable utilizar la familia de funciones mt_rand(). Esta función utiliza un algoritmo de Mersenne Twister mucho más eficiente y rápido.
  • Uso de comillas en PHP: Las comillas simples interpretan literales, sin embargo, las comillas dobles además interpolan el valor de variables. Da siempre preferencia a las comillas simples y nunca escribas símbolos de dolar sin escapar (\$) en comillas dobles, ralentiza mucho la ejecución.
  • Comprobar si existen variables: Siempre se debería utilizar una función para comprobar si existe una variable. Entre las funciones isset(), empty() y is_array(), la primera es la más rápida y eficiente.
  • Operador ===: En las comparaciones, la diferencia del operador === con el operador == es que este último hace una comprobación de tipos de variables antes. Si estás seguro de que son del mismo tipo, utiliza el primero.
  • Memoria y velocidad: Utiliza memory_get_usage() y microtime() para comprobar la velocidad y la memoria que consume tu código.
  • Comparaciones: Los if / else son siempre más rápidos que los switch / case.
  • Las siguientes funciones son alias de las de su derecha. Utilizar la función de la izquierda es mucho más lento que usar la de la derecha:
    • chop -> rtrim
    • close -> closedir
    • die -> exit
    • dir -> getdir
    • diskfreespace -> disk_free_space
    • fputs -> fwrite
    • ini_alter -> ini_set
    • is_writeable -> is_writable
    • join -> implode
    • pos -> current
    • rewind -> rewinddir
    • strchr -> strstr
    • sizeof -> count
    Curiosamente, fputs, a pesar de ser un alias, se comenta que es más rápida que fwrite.
  • Incrementos: Cuando incrementamos una variable del modo $i++ es más lento que si lo hacemos ++$i. La diferencia es que la primera forma primero usa su valor y luego lo incrementa, en cambio, la segunda primero la incrementa y luego la usa. La segunda forma es más rápida, puesto que utiliza 3 opcodes, en lugar de los 4 opcodes de la primera. Usarla cuando sea posible.
  • Imprimiendo textos: La función echo es más rápida que la función print, además de otras diferencias.
  • Expresiones regulares: El uso de regexp es muy contradictorio. Como ventajas tenemos que usan muy poca de memoria, muy potentes y ahorran mucho código. Como desventajas son muy lentas, muy difíciles para novatos o personas que no conozcan teoría de autómatas y lenguajes formales. Personalmente, aconsejo evitarlas a no ser que sean muy necesarias. Por ejemplo, la expresión regular preg_match("![0-9]+!", $foo); reconoce cualquier cadena que sea un número, esto es mucho mas eficiente usando la función ctype_digit($foo);. Las funciones strcasecmp(), strpbrk() y stripos() pueden ayudar mucho.
  • Reporte de errores: Utiliza E_STRICT como nivel de error para hacer debug en tu código PHP. Revisando los logs podrás ver todos los avisos de posibles errores con un nivel máximo.
  • Separaciones: split() permite utilizar expresiones regulares, mientras que explode() no. Intenta utilizar explode siempre antes que la función split.
Copy/Paste desde emezeta.

4 comentarios:

Carina dijo...

En realidad lo que queria es comunicarme con Ud Señor Garrido por el tema de un software de Educacion.Aqui le envio mi email cari.zapana@gmail.com GRACIAS

EL BLOG DEL BURRO dijo...

YO IWAL KERO COMUNICARME CON TIGO KTO

HOLA PO PILLO XD SOY EL BASTIAN BELMAR VIVO AL FRENTE DEL NEGOCIO Y SOY HIJO DE UNA TRABAJADORA DE AHI

NOSE SI TE ACUERDAS WENO ESTO ES POR UNA DUDA QUE TENGO

LO QUE PASA ES QUE BAJE UN TORRENT DE UBUNTU 10.04 Y FUNCIONO TODO BIEN

PARA NO TENER DUDAS Y PROBLEMAS LO GRABE EN UN DVD

EL AUTORUN FUNCIONO LA RAJA.

REINICIE LA PC Y TODO BIEN PERO EN EL PASO 4 DE LA INSTALACION NO SALIA NADA EN LAS REPARTICIONES DE DISCO.

SALIA EL CUADRADO Y NADA MAS U.U

Y PUSE ADELANTE XD PARA SEGUIR PERO SALIA QUE NO HABIA ECHO NADA

PERO COMO VOY A HACER ALGO SI NO SE PUEDE

ANTES DE QUE ME BAJE EL NIVEL Y INTENTE CON LA 9.04 ME PUEDES DECIR COMO SOLUCIONO ESTO XDD

AHH TAMBIEN PROBE CON EL WUBI Y TMPOCO SE PUDO

PROBE CON PENDRIVE Y NO SUPE QUE PONER CUANDO LO REINICIE XD

CON EL DISCO IBA TODO BIEN Y PASO ESTO AYUDAME :)

hacksandbas@hackded.com

CONTACTATE ;)

Carlos R. dijo...

Holap:

Yo añadiría:

-Si es posible, utiliza Javascript antes de PHP, debido a que PHP usa los recursos del servidor... mientras que Javascript usa los del cliente... ;)

Saludooos :P

Jorge Ramiro dijo...

En una época había comenzado a programar en este tipo de lenguaje y había entendido como generar ciertas paginas web, pero como ya hace bastante lo deje, debería retomar mis clases para recordar como era, porque me olvide de casi todo. Estaba con ganas de conseguir algunos tutoriales para ver a través de mi lg tv