signal

(PHP 8.6+, True Async 1.0)

signal() — Wartet auf ein Betriebssystem-Signal. Gibt ein Future zurueck, das mit einem Signal-Wert aufgeloest wird, wenn das Signal empfangen wird.

Beschreibung

php
signal(Async\Signal $signal, ?Async\Completable $cancellation = null): Async\Future

Erstellt einen einmaligen Betriebssystem-Signal-Handler. Jeder Aufruf von signal() erstellt ein neues Future, das beim ersten Empfang des angegebenen Signals aufgeloest wird. Wenn der Parameter $cancellation angegeben wird, wird das Future abgelehnt, wenn der Abbruch ausgeloest wird (z.B. bei Timeout).

Mehrere Aufrufe von signal() mit demselben Signal arbeiten unabhaengig voneinander — jeder erhaelt eine Benachrichtigung.

Parameter

signal Ein Async\Signal-Enum-Wert, der das erwartete Signal angibt. Zum Beispiel: Signal::SIGINT, Signal::SIGTERM, Signal::SIGUSR1.

cancellation Ein optionales Objekt, das Async\Completable implementiert (z.B. ein Ergebnis von timeout()). Wenn das Abbruchobjekt vor dem Eintreffen des Signals ausgeloest wird, wird das Future mit der entsprechenden Ausnahme abgelehnt (z.B. Async\TimeoutException).

Wenn das Abbruchobjekt zum Zeitpunkt des Aufrufs bereits abgeschlossen ist, gibt signal() sofort ein abgelehntes Future zurueck.

Rueckgabewerte

Gibt Async\Future<Async\Signal> zurueck. Wenn das Signal empfangen wird, wird das Future mit dem Async\Signal-Enum-Wert aufgeloest, der dem empfangenen Signal entspricht.

Fehler/Ausnahmen

  • Async\OperationCanceledException — wenn der Abbruch-Token ausgelöst wird (einschließlich Timeout). Die ursprüngliche Ausnahme des Tokens ist über $e->getPrevious() verfügbar (z.B. TimeoutException bei Verwendung von timeout()).

Beispiele

Beispiel #1 Auf ein Signal mit Timeout warten

php
<?php
use Async\Signal;
use function Async\signal;
use function Async\timeout;
use function Async\await;

try {
    $result = await(signal(Signal::SIGINT, timeout(5000)));
    echo "Signal empfangen: " . $result->name . "\n";
} catch (Async\OperationCanceledException $e) {
    echo "Signal nicht innerhalb von 5 Sekunden empfangen\n";
}
?>

Beispiel #2 Signal von einer anderen Coroutine empfangen

php
<?php
use Async\Signal;
use function Async\signal;
use function Async\await;
use function Async\spawn;

$future = signal(Signal::SIGUSR1);

spawn(function() {
    posix_kill(getmypid(), SIGUSR1);
});

$result = await($future);
echo "Signal empfangen: " . $result->name . "\n";
var_dump($result === Signal::SIGUSR1); // bool(true)
?>

Beispiel #3 Kontrolliertes Herunterfahren bei SIGTERM

php
<?php
use Async\Signal;
use function Async\signal;
use function Async\await;
use function Async\spawn;
use function Async\graceful_shutdown;

spawn(function() {
    await(signal(Signal::SIGTERM));
    echo "SIGTERM empfangen, fahre herunter...\n";
    graceful_shutdown();
});
?>

Beispiel #4 Bereits abgelaufener Timeout

php
<?php
use Async\Signal;
use function Async\signal;
use function Async\timeout;
use function Async\await;
use function Async\delay;

$t = timeout(1);
delay(50); // Timeout ist bereits abgelaufen

$future = signal(Signal::SIGINT, $t);

try {
    await($future);
} catch (Async\OperationCanceledException $e) {
    echo get_class($e) . "\n"; // Async\OperationCanceledException
    echo get_class($e->getPrevious()) . "\n"; // Async\TimeoutException
}
?>

Hinweise

Hinweis: Jeder Aufruf von signal() erstellt einen einmaligen Handler. Um erneut auf dasselbe Signal zu warten, rufen Sie signal() erneut auf.

Hinweis: Signal::SIGINT und Signal::SIGBREAK funktionieren auf allen Plattformen, einschliesslich Windows. Signale wie SIGUSR1, SIGUSR2 und andere POSIX-Signale sind nur auf Unix-Systemen verfuegbar.

Hinweis: Signal::SIGKILL und Signal::SIGSEGV koennen nicht abgefangen werden — dies ist eine Einschraenkung des Betriebssystems.

Signal

Das Async\Signal-Enum definiert die verfuegbaren Betriebssystem-Signale:

WertSignalBeschreibung
Signal::SIGHUP1Terminalverbindung verloren
Signal::SIGINT2Interrupt (Ctrl+C)
Signal::SIGQUIT3Beenden mit Core-Dump
Signal::SIGILL4Ungueltiger Befehl
Signal::SIGABRT6Abnormale Beendigung
Signal::SIGFPE8Gleitkomma-Arithmetikfehler
Signal::SIGKILL9Bedingungslose Beendigung
Signal::SIGUSR110Benutzerdefiniertes Signal 1
Signal::SIGSEGV11Speicherzugriffsverletzung
Signal::SIGUSR212Benutzerdefiniertes Signal 2
Signal::SIGTERM15Beendigungsanforderung
Signal::SIGBREAK21Break (Ctrl+Break, Windows)
Signal::SIGABRT222Abnormale Beendigung (Alternative)
Signal::SIGWINCH28Terminal-Fenstergroesse geaendert

Siehe auch