Optimización de velocidad y rendimiento de Laravel 101: la guía

velocidad-1249610_1920Estoy trabajando con un sitio Laravel bastante pesado con muchas solicitudes y muchas llamadas Eloquent/SQL. A pesar de que el VPS consume mucha memoria y CPU, sentí que hay margen para mejorar el rendimiento. Por eso me gustaría escribir algunas mejoras para acelerar Laravel:

1. Utilice la base de datos o Redis para el caché y las sesiones

Cuando navegue a config/cache.php y config/session.php, verá que los archivos CACHE_DRIVER y SESSION_DRIVER predeterminados son: Si tiene Redis instalado, intente configurarlo como controlador de caché y de sesión. Verifique si Redis está instalado ejecutando:

redis-cli

Si está instalado, intente definir los controladores en su archivo .env:

CONTROLADOR_DE_CACHE=redis CONTROLADOR_DE_SESIÓN=redis

2. Utilice varios comandos prefabricados artesanales

Hay varios órdenes de artesano que están diseñados para almacenar en caché varias partes de Laravel. Puedes configurarlos en el proceso de implementación de Laravel Forge o Envoyer:

ruta php artisan:cache configuración php artisan:cache optimización php artisan --force

 

Utilice la guía de herramientas para desarrolladores

Realice una ejecución en https://developers.google.com/web/fundamentals/performance/ y optimice varios pasos:

3. Optimice imágenes como PNG y JPEG

Las imágenes a veces contienen datos adicionales inútiles que se pueden optimizar sin pérdida. Por lo tanto, puede utilizar los paquetes OptiPNG y Optimización JPEGEn Ubuntu instale OptiPNG:

sudo apt-get update sudo apt-get install optipng

Y también instala JPEGOptim:

sudo apt-get install jpegoptim

Ahora navegue hasta la carpeta cuyas imágenes desea optimizar. Para optimizar, ejecute:

optipng *

Para ejecutar jpegoptim:

para i en *.jpg; hacer jpegoptim --all-progressive "$i"; hecho

Tenga en cuenta que también se pueden optimizar los subdirectorios.

4. Utilice HTTP2 en lugar de HTTP 1.1 si tiene un certificado SSL habilitado

La siguiente guía le ayudará a: El proceso de actualización a HTTP2 en Nginx.

Tenga en cuenta que necesita tener un certificado SSL. Google PageSpeed mostró un cambio en la velocidad del servidor de 0,52 s (sin HTTP2, con SSL) a 0,35 s (con HTTP2)

Resultado: Aumento de velocidad de aproximadamente 30%

5. Respuesta de caché en Redis o Archivo

A veces no es necesario llamar a la página desde una base de datos muchas veces. El simple hecho de almacenar la página en caché reduce bastante la carga. Esa es exactamente la misma idea de la Complemento de caché de respuesta de LaravelLas instrucciones de instalación son bastante buenas. En mi caso, hubo una mejora drástica en el rendimiento.

Resultado: aumento de velocidad de aproximadamente 200 ms en mi caso

6. Optimizar el tamaño del grupo de búferes innodb de InnoDB

No estoy seguro de por qué, pero por alguna razón InnoDB tiene un innodb_buffer_pool_size muy pequeño al implementar su servidor Laravel Forge inicial. En mi caso predeterminado, el innodb_buffer_pool_size era de 8 MB, mientras que algunos blogs estiman que puede reservar hasta 80% de su RAM para innodb_buffer_pool_size. Entonces edite el archivo my.conf:

sudo nano /etc/mysql/my.cnf

Y añadir por ejemplo:

tamaño del grupo de búferes innodb = 1G

Resultado: consultas varias veces más rápidas

7. Reducir la carga añadiendo swap

Mi servidor tenía problemas de memoria llena de Redis y cargas elevadas con regularidad. Esto se solucionó agregando algo de espacio de intercambio a Ubuntu. Como lo describe DigitalOcean:

Una de las formas más sencillas de aumentar la capacidad de respuesta de su servidor y evitar errores de falta de memoria en sus aplicaciones es agregar espacio de intercambio. El espacio de intercambio es un área en un disco duro que se ha designado como un lugar donde el sistema operativo puede almacenar temporalmente datos que ya no puede almacenar en la RAM.

Lea más sobre cómo agregar swap en Sitio web de DigitalOcean.

Resultado: una reducción de carga al introducir el comando 'top'

8. Usar carga ansiosa en lugar de carga diferida

Al utilizar modelos de Laravel Eloquent con relaciones, resulta tentador utilizar la "carga diferida". Esta es una forma de incluir modelos relacionales en un bucle. Por ejemplo:

comentarios->nombre; }

De esta manera, para cada blog los comentarios se cargarán en consultas separadas. Al utilizar la carga Eager, los comentarios se cargarían en UNA consulta IN:

obtener(); foreach ($blogs como $blog) { echo $blog->comentarios->nombre; }

Lea más sobre Eager Loading en Documentación de Laravel.

¿Cómo encontrar consultas que puedan necesitar optimización?

¿No sabe cómo encontrar consultas que podrían necesitar alguna optimización? Por ejemplo, ¿que podrían necesitar una carga proactiva en lugar de una carga diferida? La forma más fácil es instalar y habilitar Barra de depuración de Laravel en su servidor de desarrollo. Con esta barra de herramientas puede ver las consultas por página. Si ve muchas consultas que podrían haberse simplificado con una simple unión o consulta interna, sabrá que es su cola para optimizar ese script con carga ansiosa.

Resultado: cada consulta se guarda, un par de milisegundos por consulta

Esta lista aún está en desarrollo, aunque los consejos anteriores me permitieron mejorar la velocidad en MÁS DE 1 SEGUNDO. Si tienes algún consejo, ¡déjamelo saber en los comentarios!

Comparte también tus mejoras de velocidad 🙂

Pensamientos de 5 en “Laravel Speed and Performance Optimization 101 – The Guideline”

  1. Gracias, es muy informativo y útil.

    Encontré allí un error tipográfico interesante:
    R7. educir ….
    Supongo que debería serlo.
    7. Reducir….

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol
Ir arriba