Ciclo di vita
Ciclo di vita dei processi
- Ogni processo ha un lungo ciclo di vita
- Ogni processo è indipendente e non interferisce con gli altri
- Ogni processo può gestire più richieste nel suo ciclo di vita
- I processi eseguono l'uscita e terminano il loro ciclo di vita quando ricevono i comandi
stop
,reload
orestart
Suggerimento
Ogni processo è indipendente e non interfere con gli altri, il che significa che ogni processo mantiene le proprie risorse, variabili e istanze di classe, ad esempio, ogni processo ha la propria connessione al database; alcuni singleton vengono inizializzati una volta in ogni processo, quindi più processi inizializzeranno più volte.
Ciclo di vita delle richieste
- Ogni richiesta genera un oggetto
$request
- L'oggetto
$request
viene recuperato una volta che il trattamento della richiesta è completato
Ciclo di vita dei controller
- Ogni controller viene istanziato solo una volta per ogni processo, e più processi verranno istanziati più volte (salvo la riutilizzazione del controller; vedere ciclo di vita del controller)
- L'istanza del controller sarà condivisa tra più richieste all'interno dello stesso processo (salvo la riutilizzazione del controller)
- Il ciclo di vita del controller termina al momento dell'uscita del processo (salvo la riutilizzazione del controller)
Riguardo al ciclo di vita delle variabili
Webman è sviluppato in PHP, quindi segue completamente il meccanismo di recupero delle variabili di PHP. Le variabili temporanee generate dalla logica aziendale, comprese le istanze delle classi create con la parola chiave new, vengono recuperate automaticamente al termine della funzione o del metodo, senza necessità di dover eseguire manualmente unset
. Ciò significa che l'esperienza di sviluppo con Webman è praticamente la stessa di quella con i framework tradizionali. Ad esempio, nell'esempio seguente, l'istanza $foo
verrà automaticamente liberata al termine dell'esecuzione del metodo index:
<?php
namespace app\controller;
use app\service\Foo;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = new Foo(); // Qui si presume che esista una classe Foo
return response($foo->sayHello());
}
}
Se desideri che un'istanza di una classe venga riutilizzata, puoi salvare la classe in una proprietà statica della classe o in una proprietà di un oggetto a lungo ciclo di vita (come il controller), oppure puoi utilizzare il metodo get del Container per inizializzare l'istanza della classe, ad esempio:
<?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());
}
}
Il metodo Container::get()
è utilizzato per creare e salvare l'istanza della classe; se successivamente viene richiamato nuovamente con gli stessi parametri, restituirà l'istanza della classe precedentemente creata.
Attenzione
Container::get()
può inizializzare solo istanze senza parametri di costruttore.Container::make()
può creare istanze con parametri del costruttore, tuttavia, a differenza diContainer::get()
,Container::make()
non riutilizzerà l'istanza, il che significa che anche se viene chiamato con gli stessi parametri,Container::make()
restituirà sempre una nuova istanza.
Riguardo alle perdite di memoria
Nella maggior parte dei casi, il nostro codice aziendale non presenta perdite di memoria (è molto raro ricevere segnalazioni di perdite di memoria dagli utenti), dobbiamo solo prestare attenzione a non far espandere indefinitamente i dati degli array a lungo ciclo di vita. Vedi il codice seguente:
<?php
namespace app\controller;
use support\Request;
class FooController
{
// Proprietà array
public $data = [];
public function index(Request $request)
{
$this->data[] = time();
return response('hello index');
}
public function hello(Request $request)
{
return response('hello webman');
}
}
I controller, per impostazione predefinita, hanno un ciclo di vita lungo (salvo la riutilizzazione del controller); in modo simile, la proprietà array $data
del controller ha anche un ciclo di vita lungo, e con l'aumento delle richieste foo/index
, gli elementi dell'array $data
aumentano portando a una perdita di memoria.
Per ulteriori informazioni, si prega di consultare perdita di memoria