Ik werk met een vrij zware Laravel-site met veel verzoeken en veel Eloquent/SQL-aanroepen. Ondanks de VPS met veel geheugen en veel CPU, vond ik dat er ruimte was voor prestatieverbetering. Daarom wil ik graag wat verbeteringen opschrijven om Laravel te versnellen:
1. Gebruik Database of Redis voor cache en sessies
Wanneer u naar config/cache.php en config/session.php navigeert, ziet u dat de standaard CACHE_DRIVER en SESSION_DRIVER = bestand. Als u Redis hebt geïnstalleerd, probeer het dan gewoon in te stellen als een cache en sessie driver. Controleer of Redis is geïnstalleerd door het volgende uit te voeren:
redis-cli
Als het is geïnstalleerd, probeer dan de drivers te definiëren in uw .env-bestand:
CACHE_DRIVER=redis SESSIE_DRIVER=redis
2. Gebruik verschillende kant-en-klare opdrachten van de ambachtsman
Er zijn verschillende ambachtelijke opdrachten die zijn gemaakt om verschillende delen van Laravel te cachen. Je kunt ze configureren in het implementatieproces van Laravel Forge of Envoyer:
php artisan route:cache php artisan config:cache php artisan optimaliseren --force
Richtlijnen voor het gebruik van ontwikkelaarshulpmiddelen
Voer een run uit op https://developers.google.com/web/fundamentals/performance/ en optimaliseer verschillende stappen:
3. Optimaliseer afbeeldingen zoals PNG's en JPEG's
Afbeeldingen bezitten soms nutteloze extra data die lossless geoptimaliseerd kunnen worden. Daarom kunt u de pakketten gebruiken OptiPNG en JPEGOptim. Installeer OptiPNG in Ubuntu:
sudo apt-get update sudo apt-get install optie
En installeer ook JPEGOptim:
sudo apt-get installeer jpegoptim
Navigeer nu naar de map waarvan u de afbeeldingen wilt optimaliseren. Voor optipng voert u het volgende uit:
optellen *
Voor jpegoptim voer je het volgende uit:
voor i in *.jpg; doe jpegoptim --all-progressive "$i"; gedaan
Houd er rekening mee dat ook de submappen geoptimaliseerd kunnen zijn
4. Gebruik HTTP2 in plaats van HTTP 1.1 als u een SSL-certificaat hebt ingeschakeld
De volgende richtlijn helpt u hierbij: het proces van updaten naar HTTP2 in Nginx.
Let op dat u een SSL-certificaat nodig hebt. Google PageSpeed gaf een verandering in de serversnelheid van 0,52s (zonder HTTP2, met SSL) naar 0,35s (met HTTP2)
Resultaat: Ongeveer 30% snelheidsverhoging
5. Cache-respons in Redis of Bestand
Soms is het onnodig dat de pagina meerdere keren vanuit een database wordt aangeroepen. Alleen al het cachen van de pagina vermindert de belasting aanzienlijk. Dat is precies hetzelfde idee van de Laravel Response Cache-plug-in. De installatie-instructies zijn behoorlijk goed. In mijn geval was er een drastische prestatieverbetering.
Resultaat: in mijn geval een snelheidsverhoging van ongeveer 200 ms
6. Optimaliseer InnoDB innodb_buffer_pool_size
Ik weet niet waarom, maar om een of andere reden heeft InnoDB een heel kleine innodb_buffer_pool_size bij het implementeren van je eerste Laravel Forge-server. In mijn standaardgeval was de innodb_buffer_pool_size 8 MB, terwijl sommige blogs schatten dat je tot 80% van uw ram voor innodb_buffer_pool_sizeBewerk dus het bestand my.conf:
sudo nano /etc/mysql/my.cnf
En voeg bijvoorbeeld toe:
innodb_buffer_pool_grootte = 1G
Resultaat: Meerdere malen snellere query's
7. Verminder de belasting door swap toe te voegen
Mijn server had regelmatig Redis full-memory problemen en hoge belastingen. Dit werd opgelost door wat swap toe te voegen aan Ubuntu. Zoals beschreven door DigitalOcean:
Een van de makkelijkste manieren om de responsiviteit van uw server te vergroten en u te beschermen tegen out of memory errors in uw applicaties is om wat swap space toe te voegen. Swap is een gebied op een harde schijf dat is aangewezen als een plek waar het besturingssysteem tijdelijk data kan opslaan die het niet langer in het RAM kan bewaren.
Lees meer over het toevoegen van swap op de DigitalOcean-website.
Resultaat: een vermindering van de belasting bij het invoeren van het 'top'-commando
8. Eager Loading gebruiken in plaats van Lazy Loading
Bij het gebruik van Laravel Eloquent-modellen met relaties is het verleidelijk om 'lazy loading' te gebruiken. Dat is een manier om relationele modellen in een lus te krijgen. Bijvoorbeeld:
opmerkingen->naam; }
Op deze manier worden de opmerkingen voor elke blog in aparte query's geladen. Bij gebruik van Eager loading worden de opmerkingen in ONE IN query geladen:
get(); foreach ($blogs als $blog) { echo $blog->comments->name; }
Lees meer over Eager Loading op Laravel's documentatie.
Hoe vind ik zoekopdrachten die geoptimaliseerd moeten worden?
Weet u niet hoe u query's kunt vinden die mogelijk geoptimaliseerd moeten worden? Bijvoorbeeld die eager loading nodig hebben in plaats van lazy loading? De eenvoudigste manier is om te installeren en in te schakelen Laravel-debugbalk op uw ontwikkelserver. Met deze werkbalk kunt u de query's per pagina bekijken. Als u veel query's ziet die vereenvoudigd hadden kunnen worden met een simpele join of in-query, weet u dat het uw wachtrij is om dat script te optimaliseren met eager loading.
Resultaat: Elke query opgeslagen, een paar milliseconden per query
Deze lijst is nog steeds een work-in-progress lijst, hoewel bovenstaande tips mij een snelheidsverbetering van MEER DAN 1 SECONDE gaven. Heb je tips, laat het me weten in de comments!
Deel ook je snelheidsverbeteringen 🙂
Bedankt, het is erg informatief en nuttig.
Daar vond ik een leuke typefout:
R7. opleiden ….
Ik denk dat het zo zou moeten zijn
7. Verminder ….
Bedankt, ik heb het gecorrigeerd!
Ik vind je site geweldig!
De informatie is duidelijk, to the point en nuttig.
Leuke tips! Ik schrijf ook een artikel met een korte beschrijving over Laravel Performance Optimization, dat ontwikkelaars helpt om de Laravel-app te versnellen
https://www.cloudways.com/blog/laravel-performance-optimization/
U kunt dit pakket ook gebruiken om uw paginagedeelten in Redis te cachen, wat de snelheid enorm verhoogt.
https://github.com/imanghafoori1/laravel-widgetize