Posted on: September 30, 2021 11:26 AM
Posted by: Renato
Categories: Laravel query eloquent webservice aws
Views: 754
Laravel Otimizacao em ambiente de producao
Uma simples dica para melhorar a performace e não sofrer.
Primeiro ache uma VPS bacana com boa quantidade de nucleos e memoria.(AWS, Digital Ocean, Google Cloud).
- Configurações no PHP.
- Utilização de recursos desnecessários do banco de dados.
- Utilização de recursos indevidamente na programação.
### Coisas que você pode verificar:
- Verificar a utilização do método lazy loading para carregar relacionamentos e utilizar eager loading: https://laravel.com/docs/5.8/eloquent-relationships#eager-loading
- Evitar queries do tipo n+1, esta biblioteca ajuda a identificar isto: https://github.com/beyondcode/laravel-query-detector.
- Verificar a velocidade de execução das queries no banco. Determinadas queries podem não estar otimizadas, podem estar utilizando muitos recursos do banco. Tente simplifica-las, fazer as tarefas com um número menor de queries.
- Sobre cache, se puder trabalhar com Redis seria interessante.
- Utilizar PHP-FPM também ajuda na velocidade do sistema.
- Utilizar o debug bar: https://github.com/barryvdh/laravel-debugbar, ele ajudará a identificar as queries utilizadas em cada página e fica mais fácil avaliar as otimizações.
De forma geral, um gargalho bem grande é a execução desnecessária de queries e a utilização de memória.
N + 1 - Evitar
Problema:
Meu trabalho tem muitos problemas de desempenho. Quase todos os casos são consultas N + 1. Eu tenho que gastar muito tempo para encontrá-los ... e simplesmente me sinto com raiva e cansado.
Existe um pacote útil para você: https://github.com/beyondcode/laravel-query-detector
Um agradecimento a um autor por um bom pacote.
Mas, como desenvolvedor, quero fazer uma solução simples por mim.
Solução:
Depois de ler o código-fonte do Laravel, descobri uma maneira de detectar consultas N + 1 em algumas linhas de código.
class LazyLoadingException extends \Exception
{
}
trait LazyLoadingDetector
{
/**
* Get a relationship value from a method.
*
* @param string $method
*
* @return mixed
*
* @throws \LogicException
* @throws \LazyLoadingException
*/
protected function getRelationshipFromMethod($method)
{
$modelName = static::class;
$exception = new LazyLoadingException("Attempting to lazy-load relation '$method' on model '$modelName'");
if (! app()->isLocal()) {
logger()->warning($exception->getTraceAsString());
goto next;
}
report($exception);
next:
return parent::getRelationshipFromMethod($method);
}
}
Uso:
class User extends Authenticatable
{
use LazyLoadingDetector;
}
Você verá o relatório no arquivo de logs se tentar N + 1 consultas.
P / s:
Eu gostaria de publicar um pacote simples.
Por favor, me diga suas opiniões e me dê uma estrela .
Refs:
Donate to Site
Renato
Developer