signal
(PHP 8.6+, True Async 1.0)
signal() — Attend un signal du système d’exploitation. Retourne un Future qui se résout avec une valeur Signal lorsque le signal est reçu.
Description
signal(Async\Signal $signal, ?Async\Completable $cancellation = null): Async\Future
Crée un gestionnaire de signal OS à usage unique. Chaque appel à signal() crée un nouveau Future qui se résout à la première réception du signal spécifié.
Si le paramètre $cancellation est fourni, le Future sera rejeté lorsque l’annulation se déclenche (par ex., à l’expiration du timeout).
Plusieurs appels à signal() avec le même signal fonctionnent indépendamment — chacun recevra une notification.
Paramètres
signal
Une valeur de l’enum Async\Signal spécifiant le signal attendu. Par exemple : Signal::SIGINT, Signal::SIGTERM, Signal::SIGUSR1.
cancellation
Un objet optionnel implémentant Async\Completable (par ex., un résultat de l’appel à timeout()). Si l’objet d’annulation se déclenche avant l’arrivée du signal, le Future sera rejeté avec l’exception correspondante (par ex., Async\TimeoutException).
Si l’objet d’annulation est déjà terminé au moment de l’appel, signal() retourne immédiatement un Future rejeté.
Valeurs de retour
Retourne Async\Future<Async\Signal>. Lorsque le signal est reçu, le Future se résout avec la valeur de l’enum Async\Signal correspondant au signal reçu.
Erreurs/Exceptions
Async\OperationCanceledException— si le jeton d’annulation s’est déclenché (y compris le timeout). L’exception originale du jeton est disponible via$e->getPrevious()(par ex.,TimeoutExceptionlors de l’utilisation detimeout()).
Exemples
Exemple #1 Attente d’un signal avec timeout
<?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 received: " . $result->name . "\n";
} catch (Async\OperationCanceledException $e) {
echo "Signal not received within 5 seconds\n";
}
?>
Exemple #2 Réception d’un signal depuis une autre coroutine
<?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 received: " . $result->name . "\n";
var_dump($result === Signal::SIGUSR1); // bool(true)
?>
Exemple #3 Arrêt gracieux sur SIGTERM
<?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 received, shutting down...\n";
graceful_shutdown();
});
?>
Exemple #4 Timeout déjà expiré
<?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); // Le timeout a déjà expiré
$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
}
?>
Notes
Note : Chaque appel à
signal()crée un gestionnaire à usage unique. Pour attendre le même signal à nouveau, appelezsignal()une nouvelle fois.
Note :
Signal::SIGINTetSignal::SIGBREAKfonctionnent sur toutes les plateformes, y compris Windows. Les signauxSIGUSR1,SIGUSR2et les autres signaux POSIX ne sont disponibles que sur les systèmes Unix.
Note :
Signal::SIGKILLetSignal::SIGSEGVne peuvent pas être interceptés — c’est une limitation du système d’exploitation.
Signal
L’enum Async\Signal définit les signaux OS disponibles :
| Valeur | Signal | Description |
|---|---|---|
Signal::SIGHUP |
1 | Perte de connexion au terminal |
Signal::SIGINT |
2 | Interruption (Ctrl+C) |
Signal::SIGQUIT |
3 | Quitter avec core dump |
Signal::SIGILL |
4 | Instruction illégale |
Signal::SIGABRT |
6 | Terminaison anormale |
Signal::SIGFPE |
8 | Erreur arithmétique en virgule flottante |
Signal::SIGKILL |
9 | Terminaison inconditionnelle |
Signal::SIGUSR1 |
10 | Signal utilisateur 1 |
Signal::SIGSEGV |
11 | Violation d’accès mémoire |
Signal::SIGUSR2 |
12 | Signal utilisateur 2 |
Signal::SIGTERM |
15 | Demande de terminaison |
Signal::SIGBREAK |
21 | Break (Ctrl+Break, Windows) |
Signal::SIGABRT2 |
22 | Terminaison anormale (alternative) |
Signal::SIGWINCH |
28 | Changement de taille de la fenêtre du terminal |
Voir aussi
- timeout() — Créer un timeout pour limiter l’attente
- await() — Attente du résultat d’un Future
- graceful_shutdown() — Arrêt gracieux du planificateur
- Cancellation — Mécanisme d’annulation