php pcntl_signal n'a aucun effet car pcntl redémarrera automatiquement l'appel système interrompu par défaut. La performance externe est que l'appel système ne peut pas être interrompu. La solution est de ne pas redémarrer l'appel système.
L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3
php Que dois-je faire si pcntl_signal ne fonctionne pas ?
php Utilisation et précautions de pcntl_signal
Récemment, j'ai besoin de créer un serveur multi-processus basé sur PHP. Afin de redémarrer correctement, vous devez capturer le signal SIGTERM envoyé par kill, donc pcntl_signal est utilisé.
Au début, j'ai découvert que le signal capturé n'était pas valide et ne pouvait pas entrer dans la fonction de traitement du signal. J'ai étudié le document et j'ai découvert que je devais exécuter declare(tics = 1); l'explication dit qu'il s'agit de générer une horloge et ainsi de suite. Ma compréhension est similaire à un oscillateur à cristal. Après l'ajout, le processus parent peut recevoir le signal.
Mais le processus enfant ne peut toujours pas recevoir le signal. Après une longue vérification, je n'ai vu aucune exception. Le processus enfant bloque généralement socket_accept. Je doutais que l'appel système ne puisse pas être interrompu ici, je l'ai donc remplacé par un. while 1 boucle, et je peux entrer en douceur dans la fonction de gestionnaire d'interruption.
Ensuite, j'ai cherché et découvert que pcntl redémarrera automatiquement l'appel système interrompu par défaut, et la performance externe est que l'appel système ne peut pas être interrompu.
En regardant le manuel à ce moment-là, il s'avère que pcntl_signal a un troisième paramètre, qui est également un paramètre facultatif. Il nous permet de décider s'il faut redémarrer automatiquement l'appel système. Introduction à la fonction SPCNTL_SIGNAL
(PHP 4 & GT; = 4.1.0, PHP 7, PHP 8)
pcntl_signal — Installer un processeur de signal
Rreee
la fonction pcntl_signal () installe un nouveau gestionnaire de signal pour le signal spécifié par signo.
Paramètres
signo
numéro de signal.
handler
Le gestionnaire de signal peut être le nom d'une fonction ou d'une méthode créée par l'utilisateur, ou il peut s'agir de la constante système SIG_IGN (Annotation : Ignorer le gestionnaire de signal) ou SIG_DFL (gestionnaire de signal par défaut).
Remarque :
Faites attention lorsque vous utilisez une méthode sur un objet, le nombre de références de l'objet est incrémenté afin qu'il persiste jusqu'à ce que vous le modifiiez vers un autre traitement ou que le script se termine.
restart_syscalls
Spécifie si le redémarrage de l'appel système est disponible lorsque le signal arrive. (Note de traduction : après vérification des informations, ce paramètre signifie si l'appel système est redémarré depuis le début lorsque l'appel système est interrompu par un signal. Cependant, selon http://bugs.php.net/bug.php?id =52121, ce paramètre Il y a un bug et il n'est pas valide)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!