Das Debuggen und ordnungsgemäße Verwaltung des Prozesselebenszyklus ist wichtig, wenn die Multi-Process-Programmierung in PHP, insbesondere beim Erstellen von untergeordneten Prozessen mit proc_open ,. In diesem Artikel wird vorgestellt, wie Multi-Process-Programme debuggen und sich darauf konzentrieren, die korrekte Verwendung der Proc_terminate -Funktion zu erklären.
Multi-Process-Programme sind oft viel komplexer als Einzelprozess-Programme, und sie sind anfällig für die folgenden Probleme beim Debuggen:
Der Kinderprozess begann nicht wie erwartet oder beendete sofort
Der übergeordnete Prozess kann die Ausgabe oder den Status des untergeordneten Prozesss nicht korrekt erfassen
Der untergeordnete Prozess kann nicht korrekt gekündigt werden, was zum Zombie -Prozess oder zum Leckage von Ressourcen führt
Es gibt ein Problem mit Kommunikation oder Synchronisation zwischen mehreren Prozessen
Diese Probleme müssen mit Hilfe einiger Tools und Debugging -Techniken gelöst werden.
PHP verwendet normalerweise Proc_open () , um externe Prozesse zu starten, wodurch Multi-Processe implementiert werden. Beispiel:
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"], // Standardeingabe
1 => ["pipe", "w"], // Standardausgabe
2 => ["pipe", "w"] // Standardfehler
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// Lesen Sie die Ausgabe des Kinderprozesses
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// Schließen Sie den Vorgang und erhalten Sie den Ausgangscode
$status = proc_close($process);
echo "Subprozessausgabe:$output\n";
echo "Subprozess -Beenden -Code:$status\n";
} else {
echo "Der Launcher -Prozess ist fehlgeschlagen\n";
}
?>
Beachten Sie hier, dass M66.net den ursprünglichen Domänennamen ersetzt.
Durch die Proc_open -Pipeline kann die Standardausgabe und die Fehlerausgabe des untergeordneten Prozesses erfasst werden, was für Positionierungsprobleme geeignet ist.
<?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 "Standardausgabe:\n$stdout\n";
echo "Standardfehler:\n$stderr\n";
echo "Code beenden:$exitCode\n";
}
?>
Durch das Drucken der Fehlerausgabeinformationen können Sie im untergeordneten Prozess umgehend Skriptfehler oder Ausnahmen ermitteln.
Das Schreiben von Protokollen in Child Process -Skripten ist eine gemeinsame Methode, insbesondere wenn die Debugging -Umgebung die Ausgabe von Child Process nicht direkt erkennen kann.
<?php
file_put_contents('/tmp/m66_net_child.log', date('Y-m-d H:i:s') . " Subprozess beginnt\n", FILE_APPEND);
// Andere Logik
Sie können PHP-Debugger wie XDEBUG verwenden, um den Hör-Debug-Port-Hör-Debug-Port zu konfigurieren, um Debugging zu erreichen. Die Konfiguration ist jedoch relativ komplex und für eingehende Untersuchungen geeignet.
Proc_termate wird verwendet, um eine von Proc_open initiierte untergeordnete untergeordnete Verfahren zu erzwingen. Gemeinsame Verwendung:
proc_terminate($process, 9);
Unter ihnen ist der zweite Parameter das Signal, das 15 (sigterm) beträgt, was bedeutet, dass das anfordernde Programm normal verläuft. 9 (Sigkill) bedeutet, dass der Prozess gezwungen wird, getötet zu werden.
Der Kinderprozess läuft zu lang und muss eine Auszeit verlassen
Der Prozess tritt in eine tote Schleife oder einen nicht reagierenden Zustand ein
Alle Kinderprozesse müssen gereinigt werden, wenn der übergeordnete Prozess ausgeht
<?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)) {
// Warten5Zweite,Simulationszeitüberschreitung
sleep(5);
// Erzwungene Beendigung des Kinderprozesses
$result = proc_terminate($process, 9);
if ($result) {
echo "Der Kinderprozess wurde beendet\n";
} else {
echo "Subprozess -Beendigung ist fehl\n";
}
// Schließen Sie die Pipeline
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
// Prozessressourcen schließen
proc_close($process);
}
?>
Nach dem Aufrufen von Proc_termate wird empfohlen, Proc_close aufzurufen, um Ressourcen zu veröffentlichen
Mit eingeschränkter Signalunterstützung unter Windows kann erzwungenes Ende zusätzliche Methoden erfordern
Die erzwungene Beendigung von Prozessen kann zu häufig zu unvollständigen Daten oder Ressourcenleckagen führen
Der Schlüssel zum Debuggen von Multi-Process-Programmen liegt darin, die Standardausgabe und die Fehlerausgabe von untergeordneten Prozessen zu erfassen.
Verwenden Sie Protokolle und Debugging -Tools, um Probleme bei der Fehlerbehebung zu unterstützen
Proc_terminate ist eine Schlüsselfunktion, die den Kinderprozess endet. Die Parameterauswahl beeinflusst die Verfahrensausgangsmethode
In Kombination mit dem Zeitüberschreitungsmechanismus verwalten Sie den Lebenszyklus des Kinderprozesses vernünftigerweise und vermeiden Sie Zombieprozesse
Durch das Beherrschen der oben genannten Fähigkeiten können Sie PHP-Multi-Process-Programme effizienter entwickeln und aufrechterhalten.