Le débogage et la gestion correcte du cycle de vie des processus sont importants lors de la programmation multi-processus dans PHP, en particulier lors de la création de processus d'enfants avec ProC_Open . Cet article présentera comment déboguer les programmes multi-processus et se concentrer sur l'explication de l'utilisation correcte de la fonction proc_terminate .
Les programmes multiprogés sont souvent beaucoup plus complexes que les programmes de processus unique, et ils sont sujets aux problèmes suivants lors du débogage:
Le processus de l'enfant n'a pas commencé comme prévu ou à quitter immédiatement
Le processus parent ne peut pas capturer correctement la sortie ou l'état du processus de l'enfant
Le processus de l'enfant ne peut pas être terminé correctement, entraînant le processus de zombie ou la fuite de ressources
Il y a un problème de communication ou de synchronisation entre plusieurs processus
Ces problèmes doivent être résolus à l'aide de certains outils et de techniques de débogage.
PHP utilise généralement proc_open () pour démarrer les processus externes, implémentant ainsi les multi-processus. Exemple:
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"], // Entrée standard
1 => ["pipe", "w"], // Sortie standard
2 => ["pipe", "w"] // Erreur standard
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// Lire la sortie du processus de l'enfant
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// Fermez le processus et obtenez le code de sortie
$status = proc_close($process);
echo "Sortie de sous-processus:$output\n";
echo "Code de sortie de sous-processus:$status\n";
} else {
echo "Le processus de lanceur a échoué\n";
}
?>
Notez ici que m66.net remplace le nom de domaine d'origine.
Grâce au pipeline Proc_Open , la sortie standard et la sortie d'erreur du processus de l'enfant peuvent être capturées, ce qui est pratique pour le positionnement des problèmes.
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"],
1 => ["pipe", "w"],
2 => ["pipe", "w"]
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$exitCode = proc_close($process);
echo "Sortie standard:\n$stdout\n";
echo "Erreur standard:\n$stderr\n";
echo "Code de sortie:$exitCode\n";
}
?>
En imprimant les informations de sortie d'erreur, vous pouvez rapidement découvrir des erreurs de script ou des exceptions dans le processus de l'enfant.
La rédaction de journaux dans les scripts de processus enfant est une méthode courante, en particulier lorsque l'environnement de débogage ne peut pas voir directement la sortie du processus de l'enfant.
<?php
file_put_contents('/tmp/m66_net_child.log', date('Y-m-d H:i:s') . " Le sous-processus commence\n", FILE_APPEND);
// Autre logique
Vous pouvez utiliser PHP Debuggers tels que XDebug pour configurer le port de débogage multiproce à écouter pour réaliser le débogage. Cependant, la configuration est relativement complexe et adaptée à une enquête approfondie.
Proc_terminate est utilisé pour forcer la mise en œuvre d'un processus d'enfant initié par proc_open . Utilisation commune:
proc_terminate($process, 9);
Parmi eux, le deuxième paramètre est le signal, qui est de 15 (Sigterm), ce qui signifie que le programme de demande quitte normalement; 9 (Sigkill) signifie que le processus est obligé d'être tué.
Le processus de l'enfant fonctionne trop longtemps et doit quitter le délai d'expiration
Le processus entre dans une boucle morte ou un état insensible
Tous les processus d'enfants doivent être nettoyés lorsque le processus parent sort
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"],
1 => ["pipe", "w"],
2 => ["pipe", "w"]
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// attendez5Deuxième,Timeout de simulation
sleep(5);
// Traitement de la fin des enfants forcés
$result = proc_terminate($process, 9);
if ($result) {
echo "Le processus de l'enfant a été résilié\n";
} else {
echo "La résiliation du sous-processus a échoué\n";
}
// Fermer le pipeline
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
// Fermer les ressources de processus
proc_close($process);
}
?>
Après avoir appelé proc_termiate , il est recommandé d'appeler ProC_Close pour libérer des ressources
Avec une prise en charge du signal limité sous Windows, la fin forcée peut nécessiter des méthodes supplémentaires
La terminaison forcée des processus trop fréquemment peut entraîner des données incomplètes ou une fuite de ressources
La clé pour déboguer les programmes multiprocesses est de capturer la sortie standard de sortie et d'erreur des processus enfants.
Utilisez des journaux et des outils de débogage pour aider à résoudre les problèmes
proc_termine est une fonction clé qui met fin au processus de l'enfant. La sélection des paramètres affecte la méthode de sortie du processus
Combiné avec le mécanisme du délai d'expiration, gérez raisonnablement le cycle de vie du processus de l'enfant et évitez les processus de zombies
La maîtrise des compétences ci-dessus peut vous aider à développer et à maintenir plus efficacement les programmes multi-processus PHP.