An Interest In:
Web News this Week
- March 22, 2024
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
Laravel Release Update 9.32
Foi liberado em 28/09 o release 9.32 do Laravel.
A grande novidade deste release a incluso do helper Benchmark.
Com ele possvel medir o tempo de execuo de qualquer processo dentro da aplicao de forma isolada, bastando para isso adicionar a referncia use Illuminate\Support\Benchmark;
na classe onde a anlise ser feita.
A classe Benchmark possui apenas dois mtodos estticos a saber:
public static function measure(Closure|array $benchmarkables, int $iterations = 1): array|float
public static function dd(Closure|array $benchmarkables, int $iterations = 1): void
Ambos recebem dois parmetros:
$benchmarkables
: array de funes para anlise do tempo de processamento$iterations
: inteiro que indica a quantidade de iteraes que sero aplicadas s funes do parmetro anterior. Este parmetro opcional.
O mtodo measure
retorna um array com o tempo de cada funo executada. J o mtodo dd
, como o prprio nome diz, executa um dd
(dump and die) comando bem comum em PHP geralmente utilizado para mostrar o valor de uma varivel na camada de apresentao.
Testando
Para efeitos didticos, vamos montar um exemplo simples onde consultaremos um cliente atravs do seu ID, utilizando 5 abordagens distintas.
Conhecimento prvio sobre aplicaes Laravel (criao, configurao e execuo) requerido.
As consultas sero feitas em uma tabela que possui 1037 registros, atravs de uma contoller chamada CustomerController
. Apesar do pouco volume de informaes, ressalto que a mquina onde os testes sero executados no possui uma performance elevada, equilibrando os resultados.
Migrao
O arquivo de migrao abaixo dar uma noo da estrutura da tabela de clientes, ajudando a compreender melhor o ambiente utilizado nos testes.
<?phpuse Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema;return new class extends Migration{ /** * Run the migrations. * * @return void */ public function up() { Schema::create('customers', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained(); $table->string('last_name'); $table->string('first_name'); $table->string('email')->nullable(); $table->string('phone', 30)->nullable(); $table->string('street'); $table->string('city'); $table->string('building_number', 30); $table->string('country'); $table->string('post_code'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('customers'); }};
Rota
Vamos editar o arquivo de rotas de api (\routes\api.php) criando uma nova rota e adicionando a referncia para a controller CustomerController
que criaremos em breve:
Route::get('/{id}/show', [CustomerController::class, 'show']);
E a referncia para a controller:
use App\Http\Controllers\CustomerController;
Controller
Nossa controller ter apenas um mtodo responsvel por consultar o cliente de acordo com o ID informado.
Abaixo como a classe deve se parecer:
<?phpnamespace App\Http\Controllers;use App\Models\Customer;use Illuminate\Database\Eloquent\Relations\BelongsTo;use Illuminate\Http\Request;use Illuminate\Support\Benchmark;use Illuminate\Support\Facades\DB;class CustomerController extends Controller{ public function show(int $id) { $customer = Customer::find($id); $result = Benchmark::measure( [ 'Scenario 1' => fn() => Customer::find($id), 'Scenario 2' => fn() => Customer::where('id', ($id))->get(), 'Scenario 3' => fn() => DB::table('customers')->where('id', $id)->first(), 'Scenario 4' => fn() => DB::table('customers')->where('id', $id)->get(), 'Scenario 5' => fn() => DB::select('select * from customers where id = ?', [$id]) ], 10); if ($customer) { return response()->json([ 'time' => $result, 'data' => $customer]); } else { return response()->json(['message' => 'Customer not found'], 404); } }}
Perceba que frente de cada funes adicionei um lias: 'Scenario 1', 'Scenario 2', etc.
Esse lias, apesar de opcional, ajudar bastante a identificar qual tempo refere-se a qual funo analisada.
Testando
Assim que a aplicao estiver executando vamos fazer uma chamada rota que configuramos anteriormente e informar um cdigo para pesquisar o cliente.
Explicando
Cenrio 1
A consulta realizada neste cenrio a mais bsica, onde utilizamos o prprio modelo para buscar o cliente atravs da chave primria com o mtodo find
.
Apesar do tempo no ser um dos melhores, h que se frisar que existe um custo de processamento para converter o resultado no modelo Customer.
Cenrio 2
Neste o tempo melhorou um pouquinho em relao ao cenrio anterior. A diferena que passamos a coluna id
diretamente para consultar.
Acredito que se a coluna id
no fosse indexada o resultado seria significativamente pior.
E neste cenrio ainda temos o custo de converso do resultado da consulta no modelo Customer
.
Cenrio 3
A partir deste cenrio ficamos mais prximos do banco de dados realizando consultas consideradas mais 'brutas'.
Por conta dessa abordagem note que os tempos de retorno so melhores justamente por eliminarmos o processamento feito na camada de abstrao do Eloquent ORM.
Cenrio 4
A nica diferena em relao ao cenrio anterior que estamos utilizando o mtodo get()
ao invs do mtodo first()
.
Ocorre que ao executarmos o mtodo first()
h um processamento adicional para retornar somente o primeiro registro da consulta o que no acontece com o mtodo get()
.
Cenrio 5
Na maioria dos testes este se mostrou o mais rpido de todos porque passamos uma consulta 'bruta' ao banco de dados filtrando o cliente pelo ID informado no parmetro.
Apesar do tempo consideravelmente menor importante lembrar que este tipo de consulta no se aplica a todas as situaes possveis.
Um bom exemplo onde o resultado poderia se apresentar mais produtivo, seriam as funes de agregao de dados (sum
, max
, count
, etc) onde menos custoso j trazer as consultas agrupadas ao invs de fazer um processamento adicional na aplicao.
Todos os testes foram executados 10 vezes, conforme informamos no parmetro opcional $iterations
do mtodo esttico measure()
. Ento, o resultado mostrado refere-se ao tempo mdio das 10 tentativas realizadas.
Ao suprimir este parmetro cada uma das funes ser executada apenas uma vez.
Adies
Este release tambm trouxe outras funcionalidades:
Caminho do arquivo na funo 'dd'
A partir deste release, sempre que utilizarmos a funo dd
(dump and die) o caminho completo do arquivo tambm far parte do resultado
(mais detalhes aqui)
Encriptar e decriptar arquivos .env
Foram adicionados dois novos comandos ao script artisan
, com a finalidade de gerar um arquivo encriptado a partir do arquivo '.env', bem como decript-lo.
Para encriptar: php artisan env:encrypt
Para decriptar: php artisan env:decrypt
Lembrando que os comandos devem ser executados utilizando o terminal de sua preferncia a partir do diretrio raiz da aplicao.
(mais detalhes aqui)
A lista completa das novas funcionalidades deste release, bem como correes e melhoramentos, pode ser encontrada aqui (em ingls).
At breve!
Original Link: https://dev.to/marciopolicarpo/laravel-release-update-932-12mo
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To