Ferramentas de monitoramento:
Laravel Telescope - Monitoramento completo, incluindo APIs Laravel Debugbar - Monitoramento de requisições, queries no banco de dados, etc.
Dicas para melhorar desempenho:
- Rodar comandos artisan para criar cache:
php artisan config:cache
php artisan event:cache
php artisan route:cache
php artisan view:cache
php artisan optimze --force
(não esqueça de rodar um :clear antes para limpar o cache anterior).
- Otimizar o autoload do composer:
composer dumpautoload -o
- Usar o Laravel Telescope para monitorar a aplicação em produção.
Banco de dados SQL:
- Sempre crie indices para os dados mais pesquisados das tabelas.
- Sempre crie indices para as chaves estrangeiras.
- Verifique configurações de tunning para o banco de dados.
- A modelagem do banco afeta a performance:
- Quanto mais relacionamentos many-to-many mais processamento será demandado.
- Uma chave estrangeira significa que um JOIN será feito mais tarde.
- Evite armazenar arquivos e afins em campos BLOB e etc.
- Tente sempre resolver problemas nas queries, processamento no banco de dados é muito mais rápido que na aplicação Web.
Banco de dados no Laravel:
-
Somente recupere do banco o que você precisa, evitar select * ...
- select * from posts
- select * from posts join users...
-
Tente criar consultas usando LIMIT e OFFSET:
- select id, title, description from posts where id = 1 limit 1
- select id, title, description from posts where limit 15 offset 50
-
Resolva problemas com o menor número de queries possível: 3 queries é melhor que 4, 2 queries é melhor que 3 e 1 query é o cenário perfeito!
-
Para queries mais complexas evite usar os models do Eloquent, use a facade \DB (mais rápido).
-
Para várias inserções (bulk), use a facade \DB:
\DB:table('my-table')->insert([ [], [], [] ]);
Eloquent ORM:
- Somente recupere do banco o que você precisa:
Post::all(['title', 'description']) ou Post::...->get(['title', 'description']);
Ou
Post::select(['campos', 'etc'])...->get();
- Use Eager Loading em vez do Lazy Loading (é o padrão do Eloquent):
Exemplos:
Post::with('comments')->get()
User::with('posts.categories')
Ou usando uma instancia de Collection:
$posts->load('comments.user')
- Tente utilizar o conceito de subqueries e/ou withCount na mesma consulta SQL, evite criar mais queries se você pode resolver em uma só:
User::addSelect(['latest_post' => subquery])->withCount('posts')...->get();
-
Use generators para lidar com massa grande de dados, ou seja, LazyCollections (Laravel 6.x).
-
Utilize cache a vontade para evitar acessos desnecessários no banco de dados.
Dicas gerais:
-
Crie cache de páginas da aplicação. Lib: https://github.com/spatie/laravel-responsecache
-
Evite criar muitos services providers, quanto mais services providers, mais processamento será demandado.
-
Use Redis ou similar para administrar o cache da aplicação, será cache em memória e é muitpo mais rápido que cache em arquivos ou banco de dados.
-
Minifique assets com o Laravel Mix em produção.
link do projeto: https://github.com/schoolofnetcom/laravel-otimizacao-performance