Signatur
Beschreibung
posix_setsid() ruft den POSIX-Systemaufruf setsid() auf. Dabei wird eine neue Session erstellt, deren Leiter (Session Leader) der aufrufende Prozess wird. Der Prozess wird außerdem Leiter einer neuen Prozessgruppe und hat kein steuerndes Terminal mehr.
Diese Funktion wird typischerweise beim Erstellen von Daemon-Prozessen eingesetzt. Nach einem fork() ruft der Kindprozess posix_setsid() auf, um sich vollständig vom Elternprozess und vom Terminal zu lösen. Dadurch kann der Kindprozess im Hintergrund weiterlaufen, ohne durch Signale des Terminals (z. B. SIGHUP) beeinflusst zu werden.
Wichtig: Die Funktion schlägt fehl, wenn der aufrufende Prozess bereits Leiter einer Prozessgruppe ist. Aus diesem Grund wird vor dem Aufruf von posix_setsid() in der Regel zunächst ein pcntl_fork() durchgeführt, da der Kindprozess nach dem Fork eine neue PID erhält und damit garantiert kein Prozessgruppenleiter ist.
Diese Funktion steht nur auf POSIX-konformen Systemen (Linux, macOS, BSD) zur Verfügung und ist unter Windows nicht nutzbar.
Rückgabewert
-1 bei einem Fehler (z. B. wenn der Prozess bereits Prozessgruppenleiter ist).Beispiele
Einfachen Daemon-Prozess per Fork und setsid erstellen
<?php
if (!function_exists('posix_setsid')) {
die('POSIX-Erweiterung nicht verfügbar.');
}
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen.');
} elseif ($pid > 0) {
// Elternprozess beendet sich
echo "Elternprozess beendet. Kind-PID: $pid\n";
exit(0);
}
// Kindprozess: neue Session erstellen
$sid = posix_setsid();
if ($sid === -1) {
die('posix_setsid() fehlgeschlagen.');
}
echo "Neue Session-ID: $sid\n";
// Verzeichnis wechseln, um gemountete Dateisysteme freizugeben
chdir('/');
// Standarddateideskriptoren schließen
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
// Daemon-Logik hier ...
sleep(5);
Session-ID prüfen und Fehler behandeln
<?php
// Direkt aufgerufen (ohne vorherigen Fork) schlägt setsid fehl,
// wenn der Prozess bereits Prozessgruppenleiter ist.
$sid = posix_setsid();
if ($sid === -1) {
$error = posix_get_last_error();
echo 'Fehler: ' . posix_strerror($error) . PHP_EOL;
} else {
echo 'Session erfolgreich erstellt. Session-ID: ' . $sid . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformabhängigkeit: posix_setsid() ist nur auf POSIX-kompatiblen Betriebssystemen verfügbar (Linux, macOS, BSD). Unter Windows ist die Funktion nicht verfügbar.
Prozessgruppenleiter: Der Aufruf schlägt mit -1 fehl, wenn der aufrufende Prozess bereits Leiter einer Prozessgruppe ist. Daher sollte stets zuerst pcntl_fork() aufgerufen werden, um im Kindprozess posix_setsid() sicher nutzen zu können.
Fehlerbehandlung: Den genauen Fehlergrund erhält man über posix_get_last_error() und posix_strerror().