Cómo optimizar tus aplicaciones PHP
La optimización de aplicaciones PHP nos ayuda a desarrollar aplicaciones rápidas, pero que a la vez cuenten con calidad y eficiencia. Nuestros usuarios necesitan de aplicaciones que resuelvan los problemas en el menor tiempo posible.
Los sitios web necesitan ser rápidos, sin tomar en cuenta el tamaño del mismo. Es por ello que el principal objetivo al desarrollar una aplicación está en su optimización. En este artículo expondremos varios aspectos a tomar en cuenta para optimizar nuestras aplicaciones PHP.
Debemos tener en cuenta que si realizamos un buen diseño de nuestra ingeniería de software, nos ayudaría a escribir código con bajo costo. Llamamos bajo costo cuando nuestro código se ejecute rápidamente o este consuma menos recurso.
¿Qué es la Optimización de aplicaciones?
Cuando hablamos de optimizar nos referimos a que nuestras aplicaciones tengan un bajo costo, o sea, que se ejecuten con mayor rapidez pero que a la vez tenga calidad y eficiencia. El objetivo de optimizar las aplicaciones PHP es minimizar el código resolviendo el mismo problema.
¿Que necesitamos Optimizar?
- Tamaño de nuestra aplicación
- Consumo de memoria
- La velocidad en que se ejecuta
A continuación veremos varias recomendaciones a seguir para lograr una mayor optimización de nuestras aplicaciones PHP:
- Inicialmente se debe estudiar a fondo el lenguaje de programación PHP, debemos conocer correctamente sus funciones, para seleccionar la adecuada.
- No utilizar variables Globales, ya que PHP tiene que comprobar si existen, es mejor no declararla de ese tipo si no es necesaria.
- No mostrar código HTML dentro de código PHP.
Es mas rápido usar:
<strong><? echo “Maestros del Web”; ?></strong> en lugar de... <? echo “<strong>Maestros del Web</strong>”; ?>
PHP debe también interpretar el código HTML que se ha introducido entre sus etiquetas. Tomemos en cuenta lo siguiente:
- No declarar variables que no se van a utilizar. Estarían ocupando un espacio en memoria innecesario.
- La función “requiere_once” es bastante lenta.
- Es muy útil declarar como estáticas las variables que lo requieran.
- Minimizar el tamaño de nuestro código. Es conveniente analizar profundamente la mejor forma de escribir el código sin utilizar vías muy complejas y que hacen muy extenso nuestro código.
- Disminuir los accesos al disco. Se debe cargar a memoria la información y luego acceder al disco duro, esto tiene menos costo ya que se disminuyen el número de accesos al disco.
- Los ciclos (también llamados como bucles) pueden provocar un alto consumo de nuestro CPU, haciendo lenta nuestra aplicación.
- Es más rápido calcular el tamaño del arreglo antes del ciclo, sino cada vez que se ejecute el ciclo nuestra aplicación tendrá que calcular su tamaño.
Es mejor usar:
$entrada = array ("Azul", "Rojo", "Blanco", "Negro", "Amarillo"); $cantidad = count($entrada); for ($i = 0; $i < $cantidad; $i++){ echo $entrada[$i]; } en vez de ... $entrada = array ("Azul", "Rojo", "Blanco", "Negro", "Amarillo"); for ($i = 0; $i < count($entrada); $i++){ echo $entrada[$i]; }
Otras cuestiones que debes tomar en cuenta son:
- No suprimir errores con @, es muy lento.
- La función rand es más lenta que mt_rand.
- La función srand es más lenta que mt_srand.
- La función getrandmax es más lenta que mt_getrandmax.
- Utiliza pocos accesos a la base de datos. Al realizar una consulta selecciona solo los campos que necesites. No utilices "SELECT * FROM tabla" si no lo necesitas, utiliza "SELECT campo, campo FROM tabla".
- La programación orientada a pbjetos (POO) es muy útil, y mucho más cuando nuestra aplicación cuenta con gran cantidad de códigos, la POO nos permite obtener un mayor aprovechamiento reutilizando nuestro código.
- Comprueba el tiempo que demora tu aplicación en cargar.
- Realiza validaciones de formularios mediante javascript. No valides con PHP después de realizar un POST. El usuario tendría que esperar que se cargue nuevamente la web para que le valide el formulario.
Las aplicaciones PHP en general son rápidas. Pero es muy importante Optimizar nuestra aplicación utilizando las recomendaciones anteriores. PHP cuenta con un manual muy bueno, amplio, que nos muestra todas sus funciones.
El tema de la optimización de las aplicaciones PHP es extenso y este artículo solo da algunos datos que te orientarán en la aplicación. Por ello te recomiendo que realices otras lecturas sobre la temática.
Otras Lecturas
- Descarga de Manual sobre PHP
- Manual sobre PHP (español)
- Optimizando objetos PHP (inglés)
- PHP con APC (inglés)
[…] Desde maestrosdelweb.com me he encontrado este post http://www.maestrosdelweb.com/editorial/como-optimizar-tus-aplicaciones-php/ […]
También es mas óptimo usar comillas simples (‘) en lugar de comillas dobles (“) si no hay variables que expandir
Buen artículo.
Pero no estoy de acuerdo en que deba dejarse a javascript la validación de los formularios ya que puede estar deshabilitado, disminuyendo la usabilidad y accesibilidad de la web.
Además, pueden ocurrir errores imprevistos por la suposición de que javascript controlará las entradas de los usuarios, siempre imprevisibles.
Un saludo
Rafa: Te estan diciendo que es para evitar consumir recursos y aliviar la carga del servidor al ejecutar codigo PHP para validar un formulario ..
Buen artículo, sin embargo este punto es bastante discutible:
“Realiza validaciones de formularios mediante javascript. No valides con PHP después de realizar un POST”…
Seguir este consejo puede resultar contraproducente
Si, es verdad que podemos encontrar navegadores con javascript deshabilitado, es mejor validar del lado del cliente primero, antes de realizar un metodo POST. Si no validamos con javascript, tendriamos que hacer esperar al usuario que recargue la pagina si hay error, sino ya seria al momento la validacion.
Eso es, para el usuario es mucho más cómoda la validación del lado del cliente pero no creo que ésta deba sustituir a la del lado del servidor, sino complementarla.
Coincido con David. La validación JS puede saltarse o manipularse y puedes recibir cualquier cosa en tu aplicación.
Yo valido con JS lo que puedo, pero vuelvo a validar todo con PHP. La primera validación la uso para evitarle al usuario el envío de la página con campos vacíos o datos erróneos y que la vuelva a recibir por estos errores. Pero la validación fuerte y de la que me fío, está siempre en mis aplicaciones.
Otra cosa a considerar es el tema de uso de constantes frentes a variables. Aquí les dejo un enlace a un artículo mío:
http://pablo.enlapc.com/2006/06/08/comparativa-variables-constantes-y-arrays-en-php/
Por otro lado, les dejo este artículo que está excelente:
http://www.php.lt/benchmark/phpbench.php
Hay cosas muy importantes para rescatar aquí.
[…] http://www.maestrosdelweb.com/editorial/como-optimizar-tus-aplicaciones-php/ […]
La validación con javascript no tiene sentido si queremos que nuetras aplicaciones sean seguras. Que pasa si el cliente modifica el codigo javascript?
bueno, estamos hablando de utilizar javascript para validar formularios del lado del cliente, luego es logico realizar una validacion con PHP mediante el metodo POST para preveer que se modifique el javascript o que este este desactivado en el navegador.
Si “require_once” es muy lenta… cual es la alternativa?? ¿require()?
no es que haya alternativa, sino que deberías usarla lo mínimo posible.
Por otro lado: la POO. Si bien ayuda a reutilizar código y todo eso (que al estudiar java me lo metieron en la cabeza casi que a la fuerza), hay que tener en cuenta que la POO no es tan eficiente.
Si se busca eficiencia y rendimiento, no uses POO. Al menos no uses un montón de clases, división en capas, etc.
Para muestra un botón: usando POO, si quiero modificar el valor de un atributo, tengo que usar una función (setAtributo), mientras que de otra forma accedo directamente.
Si estamos hablando de usar comillas en vez de comillas dobles para ganar velocidad, tenemos que despedirnos de la POO. Sobretodo cuando suele implicar el uso de varios require() con el código de las clases que se van a usar.
La POO no está pensada para la máxima eficiencia, sino para facilitarle la vida al programador.
Muy bueno, gracias y coincido que no se le debe dejar a Javascript solamente la validacion, los ataques XSS y SQL Injections estan a la order del dia, y la validacion en Javascript cualquiera se la brinca.
Buen artículo, agrego algo más a lo de las sentencias SQL: Intentar tomar lo más que se pueda (pero lo necesario obviamente) en una sola sentencia, porque existe la costumbre de hacer varias sentencias para diferentes tablas en la misma DB. Se puede separar la tabla de la que se requiere obtener información por medio del operador punto ( . ).
Ej:
Es mejor hacer:
SELECT tabla1.campo1, tabla1.campo2, tabla2.campo3 FROM tabla1, tabla2..etc
Que:
SELECT * FROM tabla1
y después
SELECT * FROM tabla2
Sé que es algo bastante básico en SQL pero como también se puede hacer de esa manera (cargando la memoria bestialmente) me parece justo mencionarlo para los que comienzan. (no digo que sea un experto, incluso tal vez me equivoqué en la sintaxis pero lo digo porque antes yo lo hacía así porque no sabía que se podía hacer de otra forma).
Y otra cosa también: USAR CSS y decir NO a las tablas innecesarias para los diseños cargados, guardar un archivo .css en el cache del cliente te puede ayudar muchísimo a mejorar la velocidad de carga!
Hola.
Como bien apnta el articulo, el uso de @ para omitir errores consume recursos que podemos ahorrarnos.
El uso de la @ es a veces imprescindible a la hora de desarrollar, pero a la hora de poner el sistema en produccion, lo mejor es quitar todas las @ y usar error_reporting(0), lo cual ademas, nos evitará que se muestre información que pueda ser comprometida para la seguridad.
Respecto al tema de validar con javascript, yo siempre hago doble validación. La validacion javascript es muy comoda para el usuario, sobre todo usando el evento onBlur, lo cual percata al usuario del error conforme termina de escribir, pero como ya han comentado, esto es muy facil de ser evadido, por lo que siempre deberemos tener una segunda barrera, aunque, claro esta, consuma recursos.
Es interesante su articulo, pero a mi me parece tonto que los navegadores se desactiven para javascript, de hecho por ahi en foros del web expuse mi pagina y no faltó el “observador” que porque puse un javascript que pedia el nombre del usuario para darle un saludo personalizado ya pensaba en desactivar javascript, que quieren?, que regresemos a la era de puro html, sin javascript y de paso sin php?.
Tomaré en cuenta sus observaciones para optimizar mis codigos, gracias.
La tarea mas ardua es pasar a productivo…
validar cualquier formulario con el lenguaje de servidor es imprescindible, nunca confies en una validacion de javascript, si lo que te preocupa es la velocidad al tener que recargar la pagina, utiliza ajax
Pablasso: ajax es en parte javascript… ¿Que validación ajax puede funcionar con javascript deshabilitado…?
Por cierto, Las mejres validaciones son al menos dobles… también cuento esas validaciones parciales desde los eventos de los controles (change, blur, keyup…)
😉
[…] controlar tus errores en PHP, la seguridad de muchos sitios podría depender de ello. Y también optimizar tus PHP para que sean lo más efectivos […]
Manuel, a los más paranoicos nos gusta cargas rápidas 😉 yo he bloqueado la carga de google analytics y adsense en mi maquina, son innecesarios para mi navegación jejej
pero, no es quitarle funcionalidad a una web?, creo que para mostrar paginas de solo informacion html puro esta muy bien, pero si queremos darle un plus debemos recurrir a javascript, el problema es que si la gente lo desactiva por la razón que sea creo que es como pegarle un tiro pues lo mas probable es que tampoco vean nada si la mayor parte del contenido se genera al vuelo con javascript.
Hay alguna manera de saber si la gente tiene o no activado javascript para mostrarles en caso de desactivarlo otra web con solo html?
Manuel, muchas web realizan este tipo de verificacion, un ejemplo de esto lo hace Google con Gmail y seguro que con mucho mas de sus servicios cuando no tenemos Javascript activado o cuando nuestra conexion esta muy lenta.
Pues bien, a mi me parece buen articulo, pero quisiera que me explicaran como es que se puede un usuario pasar la validación de jscript,
de verdad saben como, o solo comentan lo comentado, yo no tengo idea de como hacer eso, y me interesa porque estoy desarrollando una pagina, no soy experto ni nada por el estilo. Sobre lo del require_once, porque no usan el include_once() o es lo mismo? 😐
Hola Madian, haz probado desactivar el javascript de tu navegador ? es muy probable que tu validacion no sea ejecutada.
Si, en efecto he desactivado el java script , y manejo esos casos, una forma de evitar que manden datos que uso es la siguiente: en el evento onsubmit del formulario, establezco return false; es decir que cualquier intento de enviar datos sin validar, por cualquier método, y un input de tipo button que en su evento onclick lanza la función que valida los campos, si todos los campos contienen información válida hace esto document.forms[item].submit(),eso es todo, de modo que si el usuario desactiva el java script, no se hace la validación, y menos el envío del formulario . Sé que no hay sitio 100% confiable en su seguridad, pero es una forma de evitar el paso de datos no deseados. Pero quisiera aclarar mi comentario anterior, allí hago referencia al comentario de que modifican el código java script en su PC, he ahí donde reside mi incógnita; y vuelvo a formular la misma cuestión ¿Alguien sabe cómo hacer eso? y me refiero con eso a como validar con código java script creado por cualquiera en su PC, validar un sitio en internet, y además que el sitio acepte ese código como propio. Siempre estoy en busca de debilidades en las páginas que programo, por eso es que di con este blog. Por el momento es todo, gracias por su espacio.
Validar con javascript?
Evidentemente el autor no sabe de lo que habla. Que manera de meterle ideas equivocadas al novato.
Hola Juan, siempre es util realizar una primera validacion con javascript del lado del cliente para validar que los datos en los formularios esten correctos y que el usuario no tenga que esperar a que se recargue la pagina. Comentanos tu punto de vista.
muy practico
vale…
pero como se cambian las variables globales por unas de aplicacion??
gracias
Hola nere, las variables de tipo globales debes definirlas en tu aplicacion, para definir variables puedes hacerlo por ejemplo:
static $variable;
hola tengo una consulta cuando uno usa arrays … y le pone como indice algo asi “nombre_array_12345678″… y el siguiente pone “nombre_array_12345678″… en ves de ponerle 1, 2, 3… esto consume Significativamente mas recursos O solo los que necesita por la diferencia de tamaño enlos indices es decir … “nombre_array_12345678” es obviamente mas grande que solo 1 jeje Repondanmeeeeeeeeeee
Hola aqui les mando un enlace que enriquecen este articulo:
http://www.tufuncion.com/optimizar-script-php
Para el autor: por favor, validación en servidor y cliente. Nunca solo en cliente. Si desactivo javascript y te meto en contraseña un ataque de inyección para mysql la mitad de los que han leido este articulo se lo comerian. Ademas, no hace falta validar, sino evitar que te la cuelen. Tambien mucho cuidado con los get, que si envian comandos te pueden hasta borrar parte de los archivos que tienes en tu servidor.
Hola Alber, todo esos problemas de inyeccion a traves de los metodos get y formularios, puedes surgir efecto en dependencia del metodo de Seguridad que emplees en el código de tu aplicacion. Existen varios formas para evitar estas inyecciones.
Hola de nuevo.
Por ahi lei que alguien preguntaba como detectar si el navegador no soporta javascript o el usuario lo ha desactivado.
Esto es facil con la etiqueta , hace tiempo que no uso javascript y olvide como se usaba exactamente, pero sabiendo como se llama, en google no tendras ningun problema.
Por otro lado, comentar y de paso publicitar el uso de la clase PEAR::DB2, que provee bastante buena seguridad frente a inyecciones SQL. (mirar metodos prepare() + execute() y query())
Solo eso. Un saludo y buena suerte a todos amigos !
Ala !! la etiqueta que decia arriba es “noscript” que la he puesto con sus respectivos < y > y el parseador de texto de la web se la ha cargado !!
El documento esta bastante bueno, coincido que la validación del lado del cliente evita el envio de datos erroneos al servidor y la espera por parte del cliente. El cliente no tiene porque ver nuestro código utilizado en javascript, siempre existiendo la principal desventaja de inhabilitar el javascript en el browser.
Saludos
[…] Podeis encontrar una lista mas completa aqui […]
Saludos.. Tengo una pregunta..
Como hacer que php detecte que la conexion que estas usando es muy lenta y automaticamente se cargue una pagina basica de tu sitio web, es algo similar como lo hace google, ella detecta si tu conexion es muy debir se carga la version basica..
Ayudenme por favor
bueno despues de leer todo los comentarios yo opino 2 cosas:
1) gracias
2) Las validaciones en javascript son absolutamente importantes, esten hechas como esten echas, son importantes, ahorran tiempo al usuario y mejoran la performance de la web. Eso NO quiere decir que no tengamos que hacer tambien las mismas y quizas mas validaciones del lado del servidor(php). Son cosas diferentes, Javascript nos valida los datos entre la interfaz y el dominio, despues con PHP validamos los datos en el dominio para llevarlos a la persistencia.
Hay que valorar el hecho de que en toda comunicacion la seguridad nos quita velocidad y performance. De que estamos hablando? de optimizacion o de seguridad? una cosa es seguro ninguna de las dos puede ser descuidada y si hay que sacrificar una, la tendecia seria perder optimizacion y ganar seguridad.
No hay nada raro en que las validaciones se hagan entre el pasaje de etapas (Interfaz-dominio-persistencia) incluso muchos sistemas hacen montañas de validaciones a nivel de persistencia en la misma BD a travez de triggers por ejemplo.
En cuanto a sentencias SQL hay un mundo, y se estudia algebra relacional para poder optimizar las consultas sql. Existen cientos de errores tipicos que enlentencen las consultas sobre todo cuando trabajamos con consultas anidadas o multibples joins entre muchas tablas. Imposible de explicar aca…
Saludos
Hola a todos exelente lo expuesto pero la verdad, con el uso de xajax se optimiza en tiempo de editar codigo js, pues se manipula las variables
asddas
chicos aprenda PHP5 esta de lujo,, y se daran cuenta de muchas cosas buenas se los recomiendo. busque este libro:
Manual Imprescindible de
PHP5
Totalmente de acuerdo con Rafa. La validación en el servidor debe ser obligatoria para evitar ciertos ataques malintencionados. Opcionalmente, la validación en el cliente puede ser de gran utilidad para el usuario final, especialmente con formularios grandes.
Respecto a la accesibilidad, utilizar javascript no es un impedimento siempre que se valide también en el servidor.
En cuanto a la eficiencia, se debe tener en cuenta que el 90% del tiempo se está ejecutando el 10% de nuestro código, es decir, es más rentable programar centrándose en la seguridad y corrección y después, si es necesario, optimizar ese 10% del código.
Un saludo
¿Alguien conoce la arquitectura de los compiladores que soportan orientación a objetos? Nos podrían dar algo de luz sobre este tema.
Por lo que sé, la diferencia de rendimiento es prácticamente imperceptible. El código ejecutable de ambos paradigmas (estructurado y orientado a objetos) se genera de la misma forma, todo son llamadas a procedimientos aunque el programador lo vea como cosas distintas. Los mecanismos de herencia, polimorfismo, resoluciones de ámbito, coherción de tipos, etc. se resuelven en tiempo de compilación excepto algunas operaciones llamadas de ‘refundición de tipos’.
Por otro lado, está la cultura del lenguaje, por ejemplo en Java se acostumbra a hacer objetos con todo, absolutamente todo. Sin embargo se puede escribir un código más optimo que no viole los principios de ocultación sin llegar al extremo de Java.
Un saludo
Gerardo
Mas que un comentarios es una pregunta, estoy desarrollando un sistema de ventas, y tengo varios clientes (comercios) que iran atrabajar en este, no todos utilizaran los mismos requerimientos entonces estoy en la duda de utilizar el mismo sistema con la misma bd para todos o es mejor por separado…
que piensas tu
gracias
Yo creo que en base a mi experiencia siempre es bueno realizar la validacion en el servidor a pesar de que te consuma memoria