Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
October 4, 2022 11:18 pm GMT

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

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To