Ciclo de vida
Ciclo de vida del proceso
- Cada proceso tiene un ciclo de vida largo.
- Cada proceso corre de manera independiente sin interferirse entre sí.
- Cada proceso puede manejar múltiples solicitudes durante su ciclo de vida.
- Los procesos se cerrarão al recibir los comandos
stop
reload
restart
, finalizando así su ciclo de vida.
Consejo
Cada proceso es independiente, lo que significa que cada proceso mantiene sus propios recursos, variables, instancias de clase, etc. Esto se refleja en que cada proceso tiene su propia conexión a la base de datos; algunos singleton se inicializan una vez en cada proceso, por lo que múltiples procesos inicializarán múltiples veces.
Ciclo de vida de la solicitud
- Cada solicitud genera un objeto
$request
. - El objeto
$request
se recuperará una vez que se haya procesado la solicitud.
Ciclo de vida del controlador
- Cada controlador se instancia una sola vez por proceso; múltiples procesos crearán múltiples instancias (excepto el caso de reutilización de controladores, consulta ciclo de vida del controlador).
- La instancia del controlador se comparte entre múltiples solicitudes dentro del mismo proceso (excepto el caso de reutilización de controladores).
- El ciclo de vida del controlador finaliza cuando el proceso se cierra (excepto el caso de reutilización de controladores).
Sobre el ciclo de vida de las variables
Webman está desarrollado en PHP, por lo que sigue completamente el mecanismo de recolección de basura de variables de PHP. Las variables temporales generadas en la lógica de negocio, incluidas las instancias de clases creadas con la palabra clave new, se recuperan automáticamente al finalizar la función o método, sin necesidad de liberar manualmente con unset
. Esto significa que la experiencia de desarrollo en Webman es prácticamente la misma que en los frameworks tradicionales. Por ejemplo, en el siguiente caso, la instancia $foo
se liberará automáticamente al finalizar la ejecución del método index:
<?php
namespace app\controller;
use app\service\Foo;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = new Foo(); // Suponemos que hay una clase Foo aquí
return response($foo->sayHello());
}
}
Si deseas que una instancia de una clase se reutilice, puedes almacenar la clase en una propiedad estática de la clase o en una propiedad de un objeto de largo ciclo de vida (como un controlador), también puedes utilizar el método get del contenedor Container para inicializar la instancia de la clase, por ejemplo:
<?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());
}
}
El método Container::get()
se utiliza para crear y guardar instancias de clases, la próxima vez que se llame con los mismos parámetros, devolverá la instancia de clase previamente creada.
Atención
Container::get()
solo puede inicializar instancias sin parámetros de constructor.Container::make()
puede crear instancias con parámetros del constructor, pero a diferencia deContainer::get()
,Container::make()
no reutiliza instancias, lo que significa que incluso con los mismos parámetros,Container::make()
siempre devolverá una nueva instancia.
Sobre fugas de memoria
En la mayoría de los casos, nuestro código de negocio no sufrirá fugas de memoria (raramente hay informes de usuarios sobre fugas de memoria), solo debemos tener cuidado con los datos de array de largo ciclo de vida para evitar que se expandan infinitamente. Por favor, observa el siguiente código:
<?php
namespace app\controller;
use support\Request;
class FooController
{
// Propiedad de array
public $data = [];
public function index(Request $request)
{
$this->data[] = time();
return response('hello index');
}
public function hello(Request $request)
{
return response('hello webman');
}
}
Los controladores son por defecto de largo ciclo de vida (excepto en el caso de reutilización de controladores), y la propiedad de array $data
del controlador también tiene un ciclo de vida largo. A medida que aumentan las solicitudes a foo/index
, la cantidad de elementos en el array $data
provoca un aumento en el uso de memoria.
Para más información relacionada, consulta fugas de memoria