Sto lavorando con un sito Laravel piuttosto pesante con molte richieste e molte chiamate Eloquent/SQL. Nonostante il VPS ad alta memoria e alta CPU, ho pensato che ci fosse spazio per migliorare le prestazioni. Ecco perché vorrei scrivere alcuni miglioramenti per velocizzare Laravel:
1. Utilizzare Database o Redis per cache e sessioni
Quando navighi su config/cache.php e config/session.php, vedi che i file CACHE_DRIVER e SESSION_DRIVER = predefiniti. Se hai installato Redis, prova semplicemente a impostarlo come driver di cache e sessione. Controlla se Redis è installato eseguendo:
redis-cli
Se è installato, prova a definire i driver nel tuo file .env:
CACHE_DRIVER=redis SESSIONE_DRIVER=redis
2. Utilizzare diversi comandi predefiniti artigianali
Ci sono vari comandi artigianali che sono fatti per mettere in cache diverse parti di Laravel. Puoi configurarli nel processo di distribuzione di Laravel Forge o Envoyer:
php artisan route:cache php artisan config:cache php artisan ottimizza --force
Utilizzare le linee guida degli strumenti per sviluppatori
Fai un giro su https://developers.google.com/web/fundamentals/performance/ e ottimizza diversi passaggi:
3. Ottimizza le immagini come PNG e JPEG
Le immagini a volte contengono dati extra inutili che possono essere ottimizzati senza perdita di dati. Pertanto puoi usare i pacchetti OptipPNG E JPEGOttimizzatoIn Ubuntu installa OptiPNG:
sudo apt-get update sudo apt-get install optipng
E installa anche JPEGOptim:
sudo apt-get install jpegoptim
Ora vai alla cartella di cui vuoi ottimizzare le immagini. Per optipng esegui:
optando *
Per eseguire jpegoptim:
per i in *.jpg; fai jpegoptim --all-progressive "$i"; fatto
Si noti che anche le sottodirectory potrebbero essere ottimizzate
4. Utilizzare HTTP2 invece di HTTP 1.1 se è abilitato un certificato SSL
La seguente guida ti aiuta a: il processo di aggiornamento a HTTP2 in Nginx.
Nota che devi avere un certificato SSL. Google PageSpeed ha cambiato la velocità del server da 0,52s (senza HTTP2, con SSL) a 0,35s (con HTTP2)
Risultato: aumento della velocità di circa 30%
5. Risposta nella cache in Redis o File
A volte non è necessario che la pagina venga chiamata da un database più volte. Il semplice fatto di mettere in cache la pagina riduce parecchio il carico. È esattamente la stessa idea di Plug-in Cache di risposta Laravel. Le istruzioni di installazione sono piuttosto buone. Nel mio caso ha avuto un drastico miglioramento delle prestazioni.
Risultato: circa 200 ms di aumento della velocità nel mio caso
6. Ottimizzare InnoDB innodb_buffer_pool_size
Non so perché, ma per qualche motivo InnoDB ha un innodb_buffer_pool_size davvero piccolo quando distribuisci il tuo server Laravel Forge iniziale. Nel mio caso predefinito, innodb_buffer_pool_size era di 8 MB, mentre alcuni blog stimano che puoi riservare fino a 80% della tua RAM per innodb_buffer_pool_sizeQuindi modifica il file my.conf:
sudo nano /etc/mysql/my.cnf
E aggiungi ad esempio:
dimensione_innodb_buffer_pool = 1G
Risultato: query molto più veloci
7. Ridurre il carico aggiungendo swap
Il mio server aveva regolarmente problemi di memoria piena e carichi elevati con Redis. Questo è stato risolto aggiungendo un po' di swap a Ubuntu. Come descritto da DigitalOcean:
Uno dei modi più semplici per aumentare la reattività del tuo server e proteggerti dagli errori di memoria esaurita nelle tue applicazioni è aggiungere un po' di spazio di swap. Lo swap è un'area su un disco rigido che è stata designata come luogo in cui il sistema operativo può archiviare temporaneamente i dati che non può più contenere nella RAM.
Per saperne di più sull'aggiunta dello swap, visita Sito web DigitalOcean.
Risultato: una riduzione del carico quando si immette il comando 'top'
8. Utilizzo del caricamento rapido anziché del caricamento lento
Quando si usano modelli Laravel Eloquent con relazioni, è allettante usare il "lazy loading". Questo è un modo per ottenere modelli relazionali in un loop. Ad esempio:
commenti->nome; }
In questo modo, per ogni blog i commenti saranno caricati in query separate. Quando si usa il caricamento Eager, i commenti saranno caricati in una query ONE IN:
get(); foreach ($blogs come $blog) { echo $blog->commenti->nome; }Per saperne di più su Eager Loading su Documentazione di Laravel.
Come trovare le query che potrebbero necessitare di ottimizzazione?
Non sai come trovare le query che potrebbero aver bisogno di ottimizzazione? Ad esempio, che potrebbero aver bisogno di caricamento veloce anziché caricamento lento? Il modo più semplice è installare e abilitare Barra di debug di Laravel sul tuo server di sviluppo. Con questa barra degli strumenti puoi visualizzare le query per pagina. Se vedi molte query che avrebbero potuto essere semplificate con un semplice join o in-query, sai che è la tua coda per ottimizzare quello script con caricamento veloce.
Risultato: ogni query salvata, un paio di millisecondi per query
Questa lista è ancora una lista work in progress, anche se i suggerimenti di cui sopra mi hanno dato un miglioramento della velocità di OLTRE 1 SECONDO. Avete suggerimenti, fatemelo sapere nei commenti!
Condividi anche i tuoi miglioramenti di velocità 🙂
Ultimo aggiornamento il 23 luglio 2018
Grazie, è molto informativo e utile.
Lì ho trovato un bel refuso:
R7. edurre ….
Suppongo che dovrebbe essere
7. Ridurre ….
Grazie, ho corretto!
Adoro il tuo sito!
Le informazioni sono chiare, pertinenti e utili.
Ottimi suggerimenti! Ho anche scritto un articolo con una breve descrizione sull'ottimizzazione delle prestazioni di Laravel che aiuta gli sviluppatori ad accelerare l'app Laravel
https://www.cloudways.com/blog/laravel-performance-optimization/
Puoi anche sfruttare questo pacchetto per memorizzare nella cache Redis le parti della tua pagina, il che ne aumenta notevolmente la velocità.
https://github.com/imanghafoori1/laravel-widgetize