Il existe souvent des scénarios comme celui-ci dans le backend. Un certain script doit être exécuté à plusieurs reprises, à ce stade, il est préférable d'avoir un démon pour nous aider à remonter automatiquement et en continu. Ces processus de script lui permettent de s'exécuter automatiquement et à plusieurs reprises.
Le module de gestion des processus de Swoole fournit la fonction de communication inter-processus, qui peut réaliser la fonction de redémarrage automatique des processus enfants. Dans swoole, nous pouvons implémenter des processus résidents via des démons de processus.
Pour réaliser la protection des sous-programmes, deux choses doivent être faites :
1 Le programme doit écouter le signal de fin du sous-processus afin de redémarrer un nouveau sous-processus. .
2. L'environnement d'exécution du processus enfant doit être indépendant du processus parent.
Le module de gestion des processus swoole fournit une méthode bool Process->exec(string $execfile, array $args), qui permet au processus enfant de se transformer en un autre programme d'appel système, tout en garantissant également que le processus parent est cohérent avec le processus actuel. Il s'agit toujours d'une relation de processus parent-enfant.
Utilisez ensuite la méthode array Process::wait(bool $blocking = true) pour attendre le signal de sortie du processus enfant.
Ce qui suit est un exemple de code qui utilise swoole pour démarrer un sous-processus et recycler les ressources du sous-processus :
<?phpuse Swoole\Process; $php = "/usr/bin/env php"; $script = dirname(__DIR__) . "/task.php"; $command = "{$php} {$script}"; $process = new Process(function (Process $worker) use ($command) { $worker->exec('/bin/sh', ['-c', $command]); }); $pid = $process->start(); printf("启动子进程 {$pid}\n");while ($ret = Process::wait()) { $pid = intval($ret["pid"] ?? 0); printf("子进程 {$pid} 结束\n"); }
Analyse du code :
La variable $command indique qu'un script de sous-processus est requis , via la méthode exec () pour démarrer l'exécution en tant que sous-processus, puis utilisez Process::wait() pour attendre la fin du script du sous-processus $command et recycler les ressources du processus.
Ensuite, tant que vous démarrez le même script de processus enfant après avoir reçu le signal de fin du processus enfant, vous pouvez réaliser la tutelle du processus enfant. Par conséquent, le premier code d'implémentation du programme pour protéger le processus enfant :
<?php use Swoole\Process; $php = "/usr/bin/env php"; $script = dirname(__DIR__) . "/task.php"; $command = "{$php} {$script}"; do { $process = new Process(function (Process $worker) use ($command) { $worker->exec('/bin/sh', ['-c', $command]); }); $pid = $process->start(); printf("启动子进程 {$pid}\n"); } while (Process::wait());
Analyse du code :
Ce code ajoute uniquement la logique de démarrage du processus enfant à une boucle infinie, de sorte que le processus enfant les scripts peuvent être redémarrés en continu.
Apprentissage recommandé : tutoriel vidéo swoole
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!