Ciclo de Vida

Ciclo de Vida do Processo

  • Cada processo possui um longo ciclo de vida
  • Cada processo é executado de forma independente e não interfere um no outro
  • Cada processo pode lidar com múltiplas requisições durante seu ciclo de vida
  • O processo executará a saída ao receber os comandos stop, reload ou restart, finalizando assim seu ciclo de vida

Dica
Cada processo é independente e não interfere no outro, o que significa que cada processo mantém seus próprios recursos, variáveis e instâncias de classes. Isso se reflete no fato de que cada processo tem sua própria conexão com o banco de dados. Algumas instâncias singleton são inicializadas uma vez em cada processo, portanto, múltiplos processos resultarão em múltiplas inicializações.

Ciclo de Vida da Requisição

  • Cada requisição gera um objeto $request
  • O objeto $request será reciclado após o processamento da requisição

Ciclo de Vida do Controlador

  • Cada controlador é instanciado uma única vez por processo, mas pode ser instanciado múltiplas vezes em múltiplos processos (exceto em casos de reutilização de controlador, veja Ciclo de Vida do Controlador)
  • A instância do controlador será compartilhada entre várias requisições no mesmo processo (exceto em casos de reutilização de controlador)
  • O ciclo de vida do controlador termina quando o processo sai (exceto em casos de reutilização de controlador)

Sobre o Ciclo de Vida das Variáveis

Webman é desenvolvido em PHP, então ele segue totalmente o mecanismo de reciclagem de variáveis do PHP. Variáveis temporárias geradas na lógica de negócios, incluindo instâncias de classes criadas com a palavra-chave new, são recicladas automaticamente após o término da função ou método, sem necessidade de unset manual. Isso significa que a experiência de desenvolvimento em Webman é basicamente a mesma que em frameworks tradicionais. Por exemplo, na seguinte instância, a instância $foo será liberada automaticamente quando o método index for concluído:

<?php

namespace app\controller;

use app\service\Foo;
use support\Request;

class IndexController
{
    public function index(Request $request)
    {
        $foo = new Foo(); // Aqui supõe-se que exista uma classe Foo
        return response($foo->sayHello());
    }
}

Se você quiser que a instância de uma classe seja reutilizada, pode armazenar a classe em uma propriedade estática da classe ou em uma propriedade de um objeto de longa duração (como um controlador), ou pode usar o método get do Container para inicializar a instância da classe, por exemplo:

<?php

namespace app\controller;

use app\service\Foo;
use support\Container;
use support\Request;

class IndexController
{
    public function index(Request $request)
    {
        $foo = Container::get(Foo::class);
        return response($foo->sayHello());
    }
}

O método Container::get() é usado para criar e armazenar a instância da classe, retornando a mesma instância da próxima vez que for chamado com os mesmos parâmetros.

Atenção
Container::get() só pode inicializar instâncias sem parâmetros de construtor. Container::make() pode criar instâncias com parâmetros de construtor, mas ao contrário de Container::get(), Container::make() não reutiliza a instância, ou seja, mesmo se chamado com os mesmos parâmetros, Container::make() sempre retornará uma nova instância.

Sobre Vazamento de Memória

Na grande maioria dos casos, nosso código de negócios não sofre de vazamento de memória (relatos de usuários sobre vazamento de memória são extremamente raros). Precisamos apenas ter cuidado para que os dados de arrays de longa duração não se expandam indefinidamente. Veja o seguinte código:

<?php
namespace app\controller;

use support\Request;

class FooController
{
    // Propriedade do array
    public $data = [];

    public function index(Request $request)
    {
        $this->data[] = time();
        return response('hello index');
    }

    public function hello(Request $request)
    {
        return response('hello webman');
    }
}

Os controladores são, por padrão, de longa duração (exceto em casos de reutilização de controlador). Da mesma forma, a propriedade do array $data do controlador também é de longa duração. À medida que solicitações para foo/index se acumulam, o número de elementos no array $data aumenta, o que pode causar vazamento de memória.

Mais informações podem ser encontradas em Vazamento de Memória