Cycle de vie

Cycle de vie des processus

  • Chaque processus a un long cycle de vie
  • Chaque processus s'exécute de manière indépendante sans interférer les uns avec les autres
  • Chaque processus peut traiter plusieurs requêtes pendant son cycle de vie
  • Un processus exécute sa sortie et met fin à son cycle de vie lorsqu'il reçoit les commandes stop, reload, restart

Conseil
Chaque processus est indépendant et sans interférence, ce qui signifie que chaque processus maintient ses propres ressources, variables et instances de classe, ce qui se manifeste par le fait que chaque processus a sa propre connexion à la base de données. Certains singletons étant initialisés une fois par processus, plusieurs processus entraîneront plusieurs initialisations.

Cycle de vie des requêtes

  • Chaque requête génère un objet $request
  • L'objet $request est récupéré après le traitement de la requête

Cycle de vie des contrôleurs

  • Chaque contrôleur n'est instancié qu'une seule fois par processus, plusieurs processus instancient plusieurs fois (à l'exception de la réutilisation des contrôleurs, voir Cycle de vie des contrôleurs)
  • L'instance du contrôleur est partagée par plusieurs requêtes dans le même processus (à l'exception de la réutilisation des contrôleurs)
  • Le cycle de vie du contrôleur se termine après la sortie du processus (à l'exception de la réutilisation des contrôleurs)

À propos du cycle de vie des variables

webman est développé sur PHP, donc il suit entièrement le mécanisme de récupération des variables de PHP. Les variables temporaires générées dans la logique métier, y compris les instances de classes créées avec le mot clé new, sont récupérées automatiquement à la fin des fonctions ou des méthodes, sans avoir besoin de les libérer manuellement avec unset. Cela signifie que le développement avec webman est fondamentalement similaire à l'expérience de développement des frameworks traditionnels. Par exemple, dans l'exemple ci-dessous, l'instance $foo sera automatiquement libérée à la fin de l'exécution de la méthode index :

<?php

namespace app\controller;

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

class IndexController
{
    public function index(Request $request)
    {
        $foo = new Foo(); // Supposons qu'il existe une classe Foo
        return response($foo->sayHello());
    }
}

Si vous souhaitez qu'une instance d'une classe soit réutilisée, vous pouvez la stocker dans une propriété statique de la classe ou dans une propriété d'un objet à long cycle de vie (comme un contrôleur), ou utiliser la méthode get du conteneur Container pour initialiser l'instance de la classe, par exemple :

<?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());
    }
}

La méthode Container::get() est utilisée pour créer et stocker une instance de classe ; la prochaine fois que vous l'appellerez avec les mêmes paramètres, elle renverra l'instance de classe précédemment créée.

Attention
Container::get() ne peut initialiser que des instances sans paramètres de constructeur. Container::make() peut créer des instances avec des paramètres de constructeur, mais contrairement à Container::get(), Container::make() ne réutilise pas les instances, c'est-à-dire que même en utilisant les mêmes paramètres, Container::make() renverra toujours une nouvelle instance.

À propos des fuites de mémoire

Dans la grande majorité des cas, notre code métier ne provoque pas de fuites de mémoire (très peu d'utilisateurs signalent des fuites de mémoire), il suffit de faire légèrement attention à ce que les tableaux de longue durée ne s'étendent pas indéfiniment. Voir le code suivant :

<?php
namespace app\controller;

use support\Request;

class FooController
{
    // Propriété tableau
    public $data = [];

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

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

Le contrôleur a une durée de vie par défaut prolongée (à l'exception de la réutilisation des contrôleurs), de même la propriété tableau $data du contrôleur est également de longue durée, avec les requêtes foo/index qui augmentent continuellement, le nombre d'éléments dans le tableau $data augmente, ce qui entraîne des fuites de mémoire.

Pour plus d'informations, veuillez consulter fuite de mémoire