Forum und email

Prozesskontrollfunktionen

Einführung

Die Prozesskontrollunterstützung in PHP implementiert die Unixausführung von Prozesserzeugung, Programmausführung, Signalverarbeitung und Prozesstermination. Prozesskontrolle sollte nicht innerhalb einer Webserverumgebung aktiviert werden und unerwartete Ergebnisse können auftreten, wenn eine Prozesskontrollfunktion innerhalb einer Webserverumgebung verwendet wird.

Die Absicht dieser Dokumentation ist es, die allgemeine Verwendung jeder der Prozesskontrollfunktionen zu erklären. Für detaillierte Informationen über Unix Prozesskontrolle empfehlen wir Ihnen, die Dokumentation Ihres Systems einschließlich fork(2), waitpid(2) und signal(2) oder eine umfassende Referenz wie zum Beispiel Advanced Programming in the UNIX Environment von W. Richard Stevens (Addison-Wesley) hinzuzuziehen.

PCNT verwendet mitlerweile Ticks als Signalverarbeitungs-Callbackmechanismus, welcher wesentlich schneller als der zuvor verwendete Mechanismus ist. Dieser Wechsel folgt der selben Semantik wie die Verwendung von "Benutzer Ticks". Man verwendet die declare() Anweisung, um die Stellen in seinem Programm anzugeben, in denen Callbacks stattfinden dürfen. Dies erlaubt Ihnen den Overhead durch die Behandlung von asynchronen Ereignissen zu minimieren. In der Vergangenheit zog das Kompilieren von PHP mit eingeschaltetem Pcntl immer diesen Overhead hinzu, egal ob ein Skript tatsächlich Pcntl verwendete oder nicht.

Es gibt eine Anpassung, die an allen Pcntl Skripten vor PHP Version 4.3.0 vorgenommen werden muss, damit diese weiterhin funktionieren. Entweder muss declare() für einen Abschnitt verwendet werden, in dem man Callbacks erlauben will, oder diese für das gesamte Skript aktivieren, indem man die neue, globale Syntax von declare() verwendet.

Hinweis: Diese Erweiterung steht auf Windowsbetriebssystemen nicht zur Verfügung.

Anforderungen

Diese Erweiterung benötigt keine externen Bibliotheken.

Installation

Prozesskontrollunterstützung in PHP ist nicht standardmäßig aktiviert. Sie müssen die CGI oder CLI Version von PHP mit der --enable-pcntl Konfigurationsoption kompilieren, um Prozesskontrollunterstützung einzuschalten.

Hinweis: Momentan wird dieses Modul nicht auf Platformen funktionieren, die nicht auf Unix basieren (Windows).

Laufzeit Konfiguration

Diese Erweiterung definiert keine Konfigurationseinstellungen in der php.ini.

Resource Typen

Diese Erweiterung definiert keine Resource-Typen.

Vordefinierte Konstanten

Die in der folgenden Liste aufgeführten Signale werden von den Prozesskontrollfunktionen unterstützt. Bitte schauen Sie in die signal(7) man Seite Ihres Systems zu Details zum vorgegebenen Verhalten dieser Signale.

WNOHANG (integer)
WUNTRACED (integer)
SIG_IGN (integer)
SIG_DFL (integer)
SIG_ERR (integer)
SIGHUP (integer)
SIGINT (integer)
SIGQUIT (integer)
SIGILL (integer)
SIGTRAP (integer)
SIGABRT (integer)
SIGIOT (integer)
SIGBUS (integer)
SIGFPE (integer)
SIGKILL (integer)
SIGUSR1 (integer)
SIGSEGV (integer)
SIGUSR2 (integer)
SIGPIPE (integer)
SIGALRM (integer)
SIGTERM (integer)
SIGSTKFLT (integer)
SIGCLD (integer)
SIGCHLD (integer)
SIGCONT (integer)
SIGSTOP (integer)
SIGTSTP (integer)
SIGTTIN (integer)
SIGTTOU (integer)
SIGURG (integer)
SIGXCPU (integer)
SIGXFSZ (integer)
SIGVTALRM (integer)
SIGPROF (integer)
SIGWINCH (integer)
SIGPOLL (integer)
SIGIO (integer)
SIGPWR (integer)
SIGSYS (integer)
SIGBABY (integer)

Beispiele

Dieses Beispiel zweigt einen Daemon Prozess mit Signalverarbeitung ab.

Example#1 Prozesskontrollbeispiel

<?php
declare(ticks=1);

$pid pcntl_fork();
if (
$pid == -1) {
     die(
"Konnte nicht abzweigen"); 
} else if (
$pid) {
     exit(); 
// Wir sind der Vater 
} else {
     
// Wir sind das Kind
}

// Vom kontrollierenden Terminal ablösen
if (!posix_setsid()) {
    die(
"Konnte nicht vom Terminal ablösen");
}

// Endlosschleife, die Aufgaben erfüllt
while (1) {

    
// Hier etwas interessantes tun

}

function 
sig_handler($signo
{

     switch (
$signo) {
         case 
SIGTERM:
             
// Aufgaben zum Abschalten bearbeiten
             
exit;
             break;
         case 
SIGHUP:
             
// Aufgaben zum Neustarten bearbeiten
             
break;
         default:
             
// Alle anderen Signale bearbeiten
     
}

}

// Signalverarbeitung einrichten
pcntl_signal(SIGTERM"sig_handler");
pcntl_signal(SIGHUP"sig_handler");

?>

Siehe auch

Ein Blick in den Abschnitt über POSIX Funktionen kann hilfreich sein.

Inhaltsverzeichnis

  • pcntl_alarm — Setzt einen Zeitschalter für die Auslieferung eines Signals
  • pcntl_exec — Führt ein angegebenes Programm im aktuellen Prozessraum aus
  • pcntl_fork — Verzweigt den laufenden Prozess
  • pcntl_getpriority — Liest die Priorität irgendeines Prozesses
  • pcntl_setpriority — Ändert die Priorität irgendeines Prozesses
  • pcntl_signal — Richtet eine Signalverarbeitung ein
  • pcntl_wait — Wartet auf ein oder gibt den Status eines abgezweigten Kindes zurück
  • pcntl_waitpid — Wartet auf ein oder gibt den Status eines abgezweigten Kindes zurück
  • pcntl_wexitstatus — Gibt den Statuscode eines beendeten Kindes zurück
  • pcntl_wifexited — Gibt TRUE zurück, wenn der Statuscode ein erfolgreiches Beenden darstellt
  • pcntl_wifsignaled — Gibt TRUE zurück, wenn der Statuscode eine Terminierung wegen eines Signals angibt
  • pcntl_wifstopped — Gibt TRUE zurück, wenn der Kindprozess gerade gestoppt ist
  • pcntl_wstopsig — Gibt das Signal zurück, welches das Anhalten des Kindes verursachte
  • pcntl_wtermsig — Gibt das Signal zurück, welches das Beenden des Kindes verursachte