Signatur
Beschreibung
posix_mkfifo() legt eine sogenannte Named Pipe (FIFO – First In, First Out) im Dateisystem an. Eine Named Pipe ist eine Spezialdatei, über die zwei unabhängige Prozesse miteinander kommunizieren können: Ein Prozess schreibt Daten in die Pipe, ein anderer liest sie heraus. Im Gegensatz zu anonymen Pipes (erzeugt durch proc_open() oder popen()) besitzt eine Named Pipe einen festen Pfad im Dateisystem und bleibt über den Lebenszyklus einzelner Prozesse hinaus erhalten.
Der Parameter permissions legt die Zugriffsrechte der neuen Datei in oktaler Schreibweise fest (z. B. 0644). Die tatsächlich gesetzten Rechte können durch die aktuelle umask des Prozesses eingeschränkt werden. Um exakt die gewünschten Rechte zu setzen, kann man die umask vorübergehend mit umask(0) auf 0 setzen.
Named Pipes eignen sich besonders für die Interprozesskommunikation (IPC) zwischen PHP-Skripten oder zwischen PHP und externen Programmen (z. B. Shell-Skripten). Das Lesen und Schreiben erfolgt über die regulären Datei-Funktionen wie fopen(), fwrite() und fread(). Die Funktion steht nur auf POSIX-kompatiblen Betriebssystemen (Linux, macOS, BSD) zur Verfügung – nicht unter Windows.
Wichtig: fopen() auf einer Named Pipe blockiert standardmäßig, bis der jeweils andere Kommunikationspartner (Leser bzw. Schreiber) die Pipe ebenfalls geöffnet hat. Dies ist ein normales Betriebssystem-Verhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Vollständiger Dateisystempfad, unter dem die Named Pipe angelegt werden soll. Die Datei darf noch nicht existieren, und das übergeordnete Verzeichnis muss beschreibbar sein. | |
| $permissions Pflicht | int | Zugriffsrechte der neuen FIFO-Datei als Oktalzahl, z. B. 0644. Die tatsächlichen Rechte können durch die aktive umask des laufenden Prozesses eingeschränkt werden. |
Rückgabewert
true zurück, wenn die Named Pipe erfolgreich erstellt wurde, andernfalls false. Im Fehlerfall (z. B. fehlende Schreibrechte, Datei existiert bereits) wird zusätzlich eine Warnung (E_WARNING) ausgegeben.Beispiele
Named Pipe erstellen und beschreiben
<?php
$pipe = '/tmp/meine_pipe';
// Named Pipe anlegen (umask kurzzeitig auf 0 setzen für exakte Rechte)
$oldUmask = umask(0);
if (!file_exists($pipe)) {
if (!posix_mkfifo($pipe, 0600)) {
die('FIFO konnte nicht erstellt werden.');
}
}
umask($oldUmask);
// Schreiber-Prozess (z. B. in einem separaten Skript oder nach fork)
$pid = pcntl_fork();
if ($pid === 0) {
// Kind-Prozess: schreibt in die Pipe
$fh = fopen($pipe, 'w');
fwrite($fh, "Hallo via Named Pipe!\n");
fclose($fh);
exit(0);
} else {
// Eltern-Prozess: liest aus der Pipe
$fh = fopen($pipe, 'r');
$inhalt = fgets($fh);
fclose($fh);
echo 'Empfangen: ' . $inhalt;
pcntl_wait($status);
}
// Aufräumen
unlink($pipe);
Existenz prüfen vor dem Anlegen
<?php
$pipe = '/tmp/ipc_channel';
if (file_exists($pipe)) {
echo 'Named Pipe existiert bereits.' . PHP_EOL;
} else {
$oldUmask = umask(0);
$result = posix_mkfifo($pipe, 0660);
umask($oldUmask);
if ($result) {
echo 'Named Pipe erfolgreich erstellt: ' . $pipe . PHP_EOL;
// Rechte überprüfen
$perms = substr(sprintf('%o', fileperms($pipe)), -4);
echo 'Rechte: ' . $perms . PHP_EOL;
} else {
echo 'Fehler beim Erstellen der Named Pipe.' . PHP_EOL;
}
}
// Wichtig · Fallstricke
Plattformverfügbarkeit: posix_mkfifo() ist ausschließlich auf POSIX-konformen Systemen (Linux, macOS, *BSD) verfügbar. Unter Windows steht die Funktion nicht zur Verfügung. PHP muss mit der POSIX-Erweiterung kompiliert worden sein (Standard bei den meisten Linux-Distributionen).
Blockierendes Verhalten: fopen() auf einer Named Pipe blockiert den Prozess so lange, bis ein zweiter Prozess die Pipe in der entgegengesetzten Richtung öffnet. Dieses Verhalten ist systemseitig und muss im Anwendungsdesign berücksichtigt werden (z. B. durch Forking oder asynchrone Verarbeitung).
Sicherheit: Named Pipes in öffentlich beschreibbaren Verzeichnissen (wie /tmp) können anfällig für Race Conditions (TOCTOU-Angriffe) sein. Prüfen Sie sorgfältig, wer Schreib- und Lesezugriff auf die Pipe erhält, und verwenden Sie restriktive Berechtigungen. Für sicherheitskritische Kommunikation sind Unix-Domain-Sockets (stream_socket_server() mit unix://) oft die bessere Wahl.
Aufräumen: Named Pipes bleiben im Dateisystem erhalten, bis sie explizit mit unlink() entfernt werden.