Como mejorar el rendimiento de tu sitio PHP. Parte I: Hardware, servidores HTTP y bases de datos
Cuando uno crea sus primeros script en PHP, los programas corren como el viento. Un par de consultas a la base de datos y la presentación en pantalla de rigor no ocupan más de unas centésimas de segundo. El problema empieza a surgir cuando se ocupan diversas librerías y las consultas a la base de datos se hacen más grandes.
El problema de optimizar un sitio en PHP es complejo, porque intervienen muchos factores.
En esta primera entrega, hablaremos sobre el hardware y dos compañeros inseparables de PHP: el servidor HTTP y los sistemas de bases de datos.
Hardware
En primer lugar, tenemos el hardware. Muchos tenderán a pensar que lo más importante es la velocidad del procesador, pero no es así. Generalmente, los cuellos de botella se producen por memoria y por la velocidad y tipo de acceso a disco duro; en el primer caso, si se supera la cantidad de memoria física del sistema, tendrá que recurrirse a la memoria swap, la cual es mucho más lenta porque implica acceso a disco duro. Para un servidor de desarrollo, que debe correr el servidor HTTP, la base de datos y el navegador, lo mínimo esperable son unos 512Mb en RAM.
En el caso de los discos duros, los discos SCSI presentan mucho mejores prestaciones bajo altas exigencias que los discos IDE (Referencia) . Ahora bien, en un entorno de desarrollo, donde los requerimientos no son altos, un disco IDE tendrá casi las mismas prestaciones que un SCSI.
Actualmente, los discos con interface ATA Serial(SATA), están desplazando a los discos SCSI porque ofrecen mejor relación precio/prestación. En el caso de los sistemas con RAID, SATA puede ser una excelente alternativa cuando lo más importante es la seguridad de lo datos y el costo final, más que el rendimiento.
Otro factor importante, que parece de perogrullo, es que en lo posible no se debe ocupar la máquina servidor en otra cosa. Además, será en general mejor el rendimiento de varias máquinas pequeñas, cada una encargada de una tarea, que una grande que tenga que todo el software. Esto, porque al estar distribuida la carga, es menos probable que se produzca un agotamiento de los recursos. Este es el esquema que utiliza, con gran éxito, Google.
También es necesario considerar la forma en que se configura la red, pero admito mi ignorancia en ese tema :P
Considerando ahora el software, existen dos factores externos a PHP que son importantes de considerar: el servidor HTTP y el sistema de base de datos a utilizar.
Servidor HTTP
Entre los más famosos se cuenta el infaltable Apache, el Internet Information Server de Microsoft, Zeus, etc. Apache es reconocido por su estabilidad, pero en situaciones de alto tráfico presenta menor rendimiento que otros servidores. IIS, bien configurado, puede ser la mejor opción en Windows para PHP. Zeus, en situaciones de alto tráfico, presenta un mejor rendimiento que Apache
Como reglas general, lo mejor es utilizar el máximo número de páginas estáticas posibles, ya que el servidor las entrega con mayor rapidez, casi sin uso de memoria y procesador. Si los recursos lo permiten, es ideal tener dos máquinas, una para los contenidos estáticos (HTML, imágenes y multimedia), en la que debe privilegiarse la velocidad de acceso a los datos, y otra encargada del contenido dinámico, con mayor memoria y capacidad de proceso.
Sistemas de bases de datos
Al igual que en el caso de los servidores, existe infinidad de sistemas de bases de datos, cada una de las cuales presenta sus ventajas en ciertos contextos. Si bien Mysql se caracteriza por tener una gran velocidad, su falta de características más avanzadas, como procedures, triggers y vistas lleva a que mucho del trabajo se lo lleve PHP, siendo posiblemente más eficiente una solución basada en la base de datos. En estos casos, PostgreSQL aparece como una excelente alternativa a tomar en cuenta si desarrollamos sitios de una envergadura mayor.
Ahora bien, en entornos empresariales es probable que nos encontremos con Sql server o con Oracle. Estas bases de datos no se caracterizan por su velocidad, así que no se extrañen que aquella consulta que en MySql volaba, ahora parezca una tortuga; es muy importante estudiar a fondo la documentación de estas bases de datos, para optimizar las consultas.
Es muy importante, al realizar cualquier tipo de test de rendimiento, utilizar la cantidad de datos que esperamos tener en la aplicación ya funcional. Suele ocurrir que una consulta que funciona de maravillas con unos diez datos se vuelva un elefante inmanejable al llegar a las mil tuplas.
En términos concretos, en Mysql es muy importante estudiar el papel de los índices, ya que pueden optimizar de modo dramático el desempeño de la base de datos. También es necesario poner especial atención en variables del servidor como el número de conexiones máximo(max_connections), el número de tablas en el cache (table_cache), el tamaño del buffer de ordenamiento(sort_buffer_size) y de de índices (key_buffer_size), entre las más importantes. Por ejemplo, si tenemos pocas tablas y muchos ordenamientos, hay que disminuir el número de tablas en cache y aumentar el buffer de ordenamiento; en caso de muchas conexiones, hay que disminuir al mínimo el tamaño de todos los buffers. Utilizando un conjunto de consultas típicas, se pueden probar distintas combinaciones hasta encontrar la más adecuada.
En SQL Server, la cantidad de memoria del servidor es importante. En entornos de desarrollo, lo mínimo recomendable es 512Mb. El tema de los índices en esta base de datos no es tan importante como en MySql, porque se generan automáticamente al establecer las relaciones foráneas. En mi experiencia, pareciera que las operaciones de orden son bastante costosas en esta base de datos, así que en general trato de utilizarlas al mínimo indispensable.
Entre los consejos generales para las distintas bases de datos, se encuentran el utilizar el tipo de datos preciso para cada columna (es mucho más lento comparar dos text que dos varchar, por ejemplo), el normalizar la base de datos a la tercera forma, por lo menos, y tratar de usar lo menos posible los campos que acepten NULL, ya que la indexación de estos campos es más lenta.
Hasta acá llegamos con este artículo. En el próximo, abordaremos el uso de sistemas de cache en PHP, tanto en lo referido al almacenamiento del código PHP compilado como a los utilizados en los scripts. Nos vemos!
Links de interés
- Optimizing Apache Server Performance
- Tuning Apache and PHP for Speed on Unix
- Configurar IIS con PHP y Fast-CGI
- SCSI & IDE: Overview and comparison
- Mysql: Optimizing Database Structure
Actualización
1 de Enero de 2005: Algunos comentarios sobre SATA, a petición de hyoga.
- 3429 lecturas

Esasto, queridi, esasto... me da risa la cantidad de tonteras que dice, con tal de poner un URL. Madre de Dios....
Aún estoy alucinado con el mensaje de spam, ¿qué trabajado, no? Madre mía, hay gente para todo :-D
Christian, no problem. Licencia CC, simplemente da mi nombre y prohíbe su uso comercial (excepto para vosé).
¡Qué publicación más notable!, ¡si hasta yo entendí! (WOW!). Está como para mandárselo a todas esas empresas de hospedaje que se pasan más tiempo en el suelo que en línea.
Oye, Claudex, ¿me dejas reproducirlo en Francotirador?. Estaría de pelos para inaugurar mi sección de tutoriales :)
AH, y salve Pepito... se nota que estos espamers fuman de la buena XD
Esos chicos del spam. Es increible a lo que llegan. Lo dejé como muestra, pero le quite los URL (como mínimo, no?)
Pepito, ¿te encuentras bien? :-)
que alguien me diga quien dicta el precio a pagar por la mas alta tecnologia cuando el encargado de adoptarla siente que es forzada antes de tiempoo por estar tan a güevos el script pasa no se yo xq. y si me seguis contestando en plan adivinanza a pesar de que se puedo ser mas paciente que lo que sea, no es eso parte de mi personalidad en este momento de mi vida? de haber caido en vuestra trampa/salvacion (blanco-negro NO, gris optimista aunque aparente pesimista :) como a este email es anonimo (que gracia para todos ¿todos?) y siendo siempre un hijo agradecido que no por ello resentido
y esas cosasme creo capacitado para pedir de una vez hablar con gente con la que intuyo me podre entender mejor que estos emails i to eso bla bla bla
sinceramente os agradezco de corazon todo, pero no entiendo una sociedad tan sumamente avanzada y tan todo por tu bien por muy demostrado que este he demostrado que (el salto de linea este es una mierda, punto a favor para que digais que necesito certezas para demasiadas cosas, gogogo!)
en la que despues a no ser que quiera que me toke la loteria monetaria para ser feliz y tal i me mandeis a no se que mundo por no celebrar el 2005
es que lo flipo si tan pocos prejuicios hay xq no sois capaces de DIALOGAR directamente con una excepcion/o no a la regla, e intentar que alguier
no se si la palabra "inteligente" es la adecuada o algo. simplemente sociedades avanzadas dialogantes a ver si tb sois capac/zes de por ver
esperanza en mi y en la decision mas importante.. no se me atengo a las reglas que sean de reconocer que tal vez pueda salir mal o algo i someterme a mas vigilancia o algo pero me gustaria que alguien entendiese mi postura, aunque claro, sin estar en ella es tal vez dificil comprender como quisiera se comprendiese lo que quiero decir pero que por mi falta/sobra de cultura y madurez fisico/mental, se q
Me he quedado pasmado. Y yo que le voy a MySQL ;).
En realidad, siempre hay que tener el sistema con harta RAM. Generalmente, el usuario promedio le da más importancia a la velocidad reloj que a la cantidad de recursos con la que cuenta. Siempre he dicho que es bueno sacrificar una cantidad de velocidad reloj por comprar más RAM. El problema es que esos Mhz menos a veces no alcanzan para más RAM :(.
Otra cosa Claudex, respecto del hardware: todos conocemos las ventajas de SCSI sobre ATA. ¿Tienes alguna comparación entre SCSI y SATA? Sería interesante, ya que el precio puede ser una gran limitante para invertir en SCSI.
Hola buen día!
Alguien me puede orientar ya que en mi servidor tengo muchos insert en varias tablas,de hecho le incremente el key_buffer_size pero sigue lento el servidor tanto que se detiene el proceso,me podrian ayudar??
gracias
Lo más sencillo es ocupar insert delayed, que retrasa los insert hasta que el servidor le quede un espacio de tiempo. La otra alternativa es hacer un lock en las tablas.
La primera forma tiene como inconveniente que las actualizaciones se retrasan, pudiendo producirse una lectura con datos viejos. La segunda forma tiene el problema de que las lecturas se bloquean hasta que las actualizaciones están listas.
Buenas tardes (y año) Claudio
Me permití tomar tu nombre del portal php
Parece que tienen mucha experiencia en el tema
tengo el siguiente problema
en Apache 2 (2.0.54) bajo Win98 lo siguiente funciona OK
[1] h=fopen("archivo.ext","w") or die("no pudo abrir");
[2] fwrite(h,"hola");
[3] fclose(h);
generando "archivo.ext" en el directorio raíz C:\xampp\htdocs\
sin embargo lo mismo en apache (1.3.27) bajo linux no puede abrir el archivo? para escribir en él??
No sé de linux, si tengo que setear permisos??
Me puedes dar un empujón
Gracias
--antoine
Exacto. Si quieres escribir en cualquier directorio, tienes que ver si tiene el permiso para que el usuario apache pueda escribir en él. Generalmente, en los directorios que están dentro del docroot se le da ese privilegio al demonio apacheniano, pero dar permiso fuera de ahí es, por lo menos, un poco peligroso.
Revisa
man chmody todo lo relacionado con los permisos de apache en linux. Te sirve, aparte, para mejorar la seguridad de tus scripts.Enviar un comentario nuevo