Publicado el 5 de Febrero del 2017
1.198 visualizaciones desde el 5 de Febrero del 2017
291,7 KB
42 paginas
Creado hace 17a (24/02/2008)
Optmización de aplicaciones PHP
(server side)
por Oriol Jiménez
Optmización de aplicaciones PHP (server side)
¿Qué es?
sistema para que este sea más eficaz.
• Optimizar es el proceso de modificar un
• En aplicaciones web en concreto perseguimos
el objetivo de:
• Disminuir el consumo de recursos.
• Aumentar la velocidad de ejecución.
Optmización de aplicaciones PHP (server side)
"La Web no va!"
• Normalmente nadie se preocupa por el
rendimiento hasta que se convierte en un
problema, como por la seguridad.
• PHP es un lenguaje perfecto para montar
startups 2.0 en pocos minutos... pero ¿qué
pasa si estas startups acaban funcionando?
• Desarrollar sistemas eficientes debería ser una
premisa ante un desarrollo no una solución a
un problema.
Optmización de aplicaciones PHP (server side)
El lado del servidor
• Software servidor
• Sistemas de caché
• Optmizaciones de código (*)
Optmización de aplicaciones PHP (server side)
Software servidor
“Lo más simple posible”
Optmización de aplicaciones PHP (server side)
IPs en Allow y Deny.
Configuración Apache I/II
• Desactivar HostnameLookups y usar siempre
• Desactivar .htaccess con "AllowOverride
• Options FollowSymLinks.
• Usar un DirectoryIndex lo más corto posible
• Desactivar ExtendedStatus (mod_status).
None".
sin wildcards.
Optmización de aplicaciones PHP (server side)
Configuración Apache II/II
un timeout bajo (5 segundos).
• ¿Keepalive or not Keepalive? en todo caso con
• Desactivar los logs (mod_log_config) si no los
usamos, que se encargue el cliente (Google
Analytics).
• Desactivar todos los módulos que no usamos.
Optmización de aplicaciones PHP (server side)
Configuración PHP I/II
• Relacionadas con los recursos del sistema:
• max_execution_time
• max_input_time
• memory_limit
• output_buffering
Optmización de aplicaciones PHP (server side)
Configuración PHP II/II
• Para aumentar el rendimiento desactivar:
• register_globals
• magic_quotes_*
• expose_php
• register_argc_argv
• always_populate_raw_post_data
• Desactivar el log de errores en producción.
Optmización de aplicaciones PHP (server side)
Contenido estático I/II
• La combinación Apache+mod_php es una de
las mejores y más rápidas para servir
contenido dinámico.
• Para servir contenido estático existen otras
opciones mucho más ligeras:
• Lighhtpd, Boa, Tux, Thttpd, LiteSpeed, ...
Optmización de aplicaciones PHP (server side)
Contenido estático II/II
mismo los ganadores en velocidad.
• De todos ellos Tux y Lighttpd son ahora
• Lighttpd es la mejor opción por posibilidades
de configuración, portabilidad, etc. (incluso
para ejecutar PHP vía FastCGI).
• Aunque no se tengan varios servidores es una
opción igualmente recomendable.
Optmización de aplicaciones PHP (server side)
Separar el contenido I/II
• Usando directorios (/images, /css, etc.):
• Es lo más común y también lo más costoso
• Podemos hacerlo con mod_rewrite:
de separar.
RewriteRule ^/(.*\.(png|gif|jpg))
http://static/$1 [NC,P,L]
RewriteRule ^/(.*)
http://dynamic/$1 [P,L]
Optmización de aplicaciones PHP (server side)
Separar contenido II/II
• Usando subdominios:
• Lo más fácil y eficaz.
• Al subdominio se le asigna la IP del servidor
• Se puede usar un mismo servidor con varias
de contenido estático.
tarjetas de red o usando un firewall.
Optmización de aplicaciones PHP (server side)
Comprimir la salida
• Ventajas:
• Reduce el tráfico de red (ancho de banda).
• Reduce el tiempo de carga de la página para
los usuarios. La página se reduce hasta 8
veces.
• Desventajas:
• Aumenta el consumo de CPU dependiendo
del nivel de compresión. El nivel 1 ofrece 4X
y un consumo aceptable.
Optmización de aplicaciones PHP (server side)
¿Cómo comprimir?
• Usando el módulo mod_deflate del Apache:
AddOutputFilterByType DEFLATE text/
html text/plain text/xml
• Usando PHP:
• Vía PHP.ini:
zlib.output_compression=1
• Cambiando el handler del output buffer:
ob_start(‘ob_gzhandler’);
Optmización de aplicaciones PHP (server side)
Cambiar el sesión handler
• El manejador de sesiones de PHP por defecto
trabaja con disco. Alternativas más rápidas:
• RAM disk del SO.
• Memoria compartida:
• mm
• apc
• memcache
Optmización de aplicaciones PHP (server side)
Caché
"¿Porqué hacer lo mismo
más de una vez?"
Optmización de aplicaciones PHP (server side)
Concepto de caché
• Una caché son datos duplicados de otros
originales donde los datos originales son
costosos de acceder en tiempo y/o recursos.
• Las estrellas invitadas:
• APC
• Memcache
• Squid
Optmización de aplicaciones PHP (server side)
Usos de la caché
generarla.
• En el desarrollo en PHP normalmente nos
interesará guardar en la caché:
• Una página completa para no volver a
• Trozos estáticos de webs semi-dinámicas.
• Resultados de consultas a BBDD u otros
• El código ya compilado para no volver a
datos.
procesarlo. (*)
Optmización de aplicaciones PHP (server side)
¿Dónde guardar la caché?
• Bases de datos (BBDD)
• Disco duro (HD)
• Memoria compartida (SHM)
Optmización de aplicaciones PHP (server side)
Memoria compartida
• Memoria accesible por varios procesos
simultáneamente con el objetivo de
comunicarse.
• En nuestro caso permite que varios procesos
del Apache accedan a los mismos datos.
Optmización de aplicaciones PHP (server side)
Configurar la memoria
• Para usar correctamente la memoria
compartida necesitamos ajustar el SO:
• FreeBSD:
# sysctl kern.ipc.shmmax
# sysctl kern.ipc.shmall
• Linux:
# cat /proc/sys/kernel/shmmax
# cat /proc/sys/kernel/shmall
Optmización de aplicaciones PHP (server side)
APC
el código "compilado".
• Caché de opcode para PHP: No tener que
procesar el código PHP en cada petición:
• Ahorra accesos a disco al leer de memoria
• Ahorra la memoria usada en el procesado
• Reduce hasta un 400% el tiempo de
• Ofrece una API para trabajar con SHM.
del código.
respuesta.
Optmización de aplicaciones PHP (server side)
Configuración del APC I/II
• Activación de la extensión:
extension=apc.so
• Directivas destacables del APC:
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
Optmización de aplicaciones PHP (server side)
Configuración del APC II/II
• Para controlar que archivos guardamos
compilados:
apc.cache_by_default=On
apc.filters=""
apc.max_file_size=1M
apc.stat=1
Optmización de aplicaciones PHP (server side)
Usando la API de APC
• Guardar un dato:
apc_store('key',serialize($obj),
3600);
• Recuperar un dato:
$result = unserialize(apc_fetch
('key'));
• Borrar un dato:
apc_delete('key');
Optmización de aplicaciones PHP (server side)
Administrar APC I/II
• Tenemos algunas funciones para consultar
información del APC:
• apc_cache_info()
• acp_sma_info()
• También dispone de una fantástica
administración vía web
Optmización de aplicaciones PHP (server side)
Administrar APC II/II
Optmización de aplicaciones PHP (server side)
Memcached
memoria distribuida.
BBDD de LiveJournal.
• Es un sistema de caché de objetos en
• Pensado originalmente para reducir la carga de
• La cache es accesible desde distintos
• Sigue una estructura LRU con el añadido de
• (Opcional) Tugela: lo mismo pero contra disco.
tiempos de expiración.
servidores.
Optmización de aplicaciones PHP (server side)
Instalación de Memcached
• Iniciamos el servidor:
# memcached -d -m 512 -l 127.0.0.1
-p 11211 -u www
• Cargamos la extensión PECL:
extension=memcache.so
Optmización de aplicaciones PHP (server side)
Usando memcached I/II
• Conectarse al servidor de caché:
memcache = new Memcache;
$memcache->connect('localhost', 11211) or die
("No se pudo conectar");
• Guardar un objeto en la caché:
$memcache->set('key', $obj, false, 10) or die
("Fallo al guardar");
• Recuperar el objeto:
$result = $memcache->get('key');
Optmización de aplicaciones PHP (server side)
Usando memcached II/II
• Las keys como máximo son de 250 carácteres
y un dato guardado no puede ocupar más de 1
MB.
• Para distribuir la caché entre distintos
servidores se ha de implementar un sistema
propio.
Optmización de aplicaciones PHP (server side)
Caché de usuario
cliente
ningún tipo
• Ventajas:
• Reduce el tráfico de red. No se envía nada al
• No consume recursos de servidor de
• Reduce la latencia. El navegador responde
• La desventaja es que no la controlamos.
directamente
Optmización de aplicaciones PHP (server side)
Headers de caché
• Fijar el tiempo de caché deseado:
• HTTP 1.0
header('Expires: '.date());
• HTTP 1.1
hedaer('Cache-Control: max-
age=3600, must-revalidate');
Optmización de aplicaciones PHP (server side)
mismo contenido.
Caché web vía headers
• Utilizar URLs únicas. Una URL siempre sirve el
• Utilizar librerías comunes de imágenes, css, js,
• Minimizar el uso de SSL.
• Hacer fácilmente variables los enlaces a
etc.
elementos:
<script src="http://phpbsd.net/js/
func.js?v=123"></script>
Optmización de aplicaciones PHP (server side)
Acelerador web
siguiendo las headers HTTP.
• Se instalan delante de los servidores web.
• Cachean las peticiones de los usuarios
• Es una de las caches más cómodas para un
programador pero también muy peligrosa.
• Tenemos varias opciones: Squid, Apache,
• Squid es el más anciano y también el más
Lighttpd, Varnish.
usado (flickr, wikipedia, etc.).
Optmización de aplicaciones PHP (server side)
Caché con handler de 404
• Se trata de generar archivos .html bajo
demanda:
• En el HTML siempre enlazamos archivos
• El servidor web ha de ejecutar un script en
el caso de no encontrar un archivo (404).
• Ese script genera el contenido solicitado.
• Las siguientes peticiones accederán
con la extensión .html.
directamente al .html.
Optmización de aplicaciones PHP (server side)
Usar la caché con 404 I/II
• Configuramos el Apache:
ErrorDocument 404 genera_pagina.php
• Mantenimiento de la caché:
# find /web -mtime +1h -print0 | xargs
-0 rm -f
Optmización de aplicaciones PHP (server side)
Usar la
Comentarios de: optimizacion de aplicaciones php server side (0)
No hay comentarios