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
ourestart
, 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 deContainer::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