Laravel / PrestazioniGiugno 20266 min di lettura

Ottimizzare Laravel quando rallenta: cosa controllo prima di dare la colpa al server

Capita a ogni sviluppatore: in locale con 20 record l'app è velocissima, ma appena inserisci 10.000 righe o carichi i dati reali in produzione, i tempi di risposta salgono a vari secondi. Anni fa la prima tentazione era potenziare il server; oggi apro Laravel Debugbar e inizio a sistemare le query.

#Laravel#PHP#MySQL#Performance#Redis

01. La trappola del lazy loading con Eloquent

Eloquent rende le relazioni così semplici da usare che spesso non ci si accorge di eseguire centinaia di query all'interno di un ciclo foreach. Il problema N+1 è quasi sempre la causa principale della lentezza.

L'eager loading con `with()` risolve subito il problema, ma è fondamentale anche smettere di richiedere colonne inutili. Trasferire campi di testo pesanti o grandi colonne JSON per decine di record satura la memoria dei processi PHP.

  • Usare sempre l'eager loading con `with()` nelle pagine con elenchi
  • Selezionare solo le colonne necessarie anziché fare `select *`
  • Attivare `Model::preventLazyLoading(!app()->isProduction())` in sviluppo
  • Paginare sempre i dati, senza riversare intere collection nelle view

02. Dove ha senso usare la cache

La cache non sostituisce una buona struttura del database, ma è utilissima per i dati letti di frequente. Menu di navigazione, impostazioni di sistema, opzioni statiche e statistiche riassuntive non devono interrogare MySQL a ogni richiesta.

Uso Redis e gestisco i calcoli pesanti con `Cache::remember()`. La cosa importante è scegliere chiavi di cache logiche, facili da invalidare con gli observer dei modelli quando i dati cambiano.

03. Le code per mantenere veloce l'interfaccia

Se un utente completa un ordine e deve aspettare che il server generi un PDF, si connetta a un server SMTP per l'email e aggiorni uno stock esterno via API, penserà che il sito sia bloccato.

Spostare email, esportazioni e chiamate a servizi terzi sulle code (database o Redis) restituisce subito la risposta all'utente, lasciando i compiti pesanti ai processi in background.

Migliorare le prestazioni in Laravel raramente significa ottimizzare micro-cicli PHP. Sistemando le query del database, usando la cache sui dati ripetitivi e mettendo in coda i compiti esterni, la maggior parte dei rallentamenti si risolve.