Lebenszyklus
Prozesslebenszyklus
- Jeder Prozess hat einen langen Lebenszyklus.
- Jeder Prozess läuft unabhängig und stört sich gegenseitig nicht.
- Jeder Prozess kann während seines Lebenszyklus mehrere Anfragen verarbeiten.
- Ein Prozess wird beim Erhalt der Befehle
stop
,reload
oderrestart
beendet und schließt damit seinen aktuellen Lebenszyklus.
Hinweis
Jeder Prozess ist unabhängig und stört sich gegenseitig nicht, was bedeutet, dass jeder Prozess seine eigenen Ressourcen, Variablen und Klasseninstanzen usw. verwaltet. Dies äußert sich darin, dass jeder Prozess eine eigene Datenbankverbindung hat. Einige Singleton-Instanzen werden einmal pro Prozess initialisiert, was bedeutet, dass mehrere Prozesse mehrfach initialisiert werden.
Anfragelebenszyklus
- Jede Anfrage generiert ein
$request
-Objekt. - Das
$request
-Objekt wird nach Abschluss der Anfrageverarbeitung wieder freigegeben.
Lebenszyklus des Controllers
- Jeder Controller wird in jedem Prozess nur einmal instanziiert; mehrere Prozesse instanziieren ihn mehrmals (außer bei der Wiederverwendung von Controllern, siehe Lebenszyklus des Controllers).
- Die Controller-Instanz wird von mehreren Anfragen im aktuellen Prozess geteilt (außer bei der Wiederverwendung von Controllern).
- Der Lebenszyklus des Controllers endet nach dem Verlassen des Prozesses (außer bei der Wiederverwendung von Controllern).
Über den Lebenszyklus von Variablen
Webman basiert auf PHP und folgt daher vollständig der Variablenfreigabemechanik von PHP. Temporäre Variablen, die in der Geschäftsanwendung erzeugt werden, einschließlich der Instanz von Klassen, die mit dem Schlüsselwort new
erstellt werden, werden automatisch freigegeben, nachdem die Funktion oder Methode beendet ist, sodass kein manuelles unset
erforderlich ist. Mit anderen Worten, die Entwicklung mit Webman ist im Wesentlichen identisch zur Entwicklung mit traditionellen Frameworks. Im folgenden Beispiel wird die Instanz von $foo
automatisch freigegeben, nachdem die Methode index abgeschlossen ist:
<?php
namespace app\controller;
use app\service\Foo;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = new Foo(); // Hier nehmen wir an, dass es eine Foo-Klasse gibt
return response($foo->sayHello());
}
}
Wenn Sie möchten, dass die Instanz einer Klasse wiederverwendet wird, können Sie die Klasse in einer statischen Eigenschaft der Klasse oder in einer long-living-Objekt-Eigenschaft (z. B. einem Controller) speichern. Sie können auch die Methode get des Container-Containers verwenden, um die Instanz der Klasse zu initialisieren, wie zum Beispiel:
<?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());
}
}
Die Methode Container::get()
wird verwendet, um eine Instanz der Klasse zu erstellen und zu speichern. Wenn Sie die Methode das nächste Mal mit denselben Parametern erneut aufrufen, wird die zuvor erstellte Instanz zurückgegeben.
Achtung
Container::get()
kann nur Instanzen ohne Konstruktorparameter initialisieren.Container::make()
kann Instanzen mit Konstruktorparametern erstellen, aber anders alsContainer::get()
wirdContainer::make()
die Instanz nicht wiederverwenden. Das bedeutet, selbst wenn die gleichen Parameter verwendet werden, gibtContainer::make()
immer eine neue Instanz zurück.
Über Speicherlecks
In den meisten Fällen tritt in unserem Geschäftscode kein Speicherleck auf (es gibt nur sehr wenige Nutzer, die von Speicherlecks berichtet haben). Wir müssen nur darauf achten, dass die Daten von langen Lebenszyklen nicht unbegrenzt wachsen. Bitte sehen Sie sich den folgenden Code an:
<?php
namespace app\controller;
use support\Request;
class FooController
{
// Array-Eigenschaft
public $data = [];
public function index(Request $request)
{
$this->data[] = time();
return response('hello index');
}
public function hello(Request $request)
{
return response('hello webman');
}
}
Controller haben standardmäßig einen langen Lebenszyklus (außer bei der Wiederverwendung von Controllern), und das Array-Attribut $data
des Controllers hat ebenfalls einen langen Lebenszyklus. Mit stetig wachsenden Anfragen an foo/index
steigt die Anzahl der Elemente im $data
-Array, was zu einem Speicherleck führt.
Weitere relevante Informationen finden Sie unter Speicherlecks