Maison > développement back-end > Problème PHP > Que dois-je faire si php pcntl_signal n'a aucun effet ?

Que dois-je faire si php pcntl_signal n'a aucun effet ?

藏色散人
Libérer: 2023-03-13 10:12:02
original
2517 Les gens l'ont consulté

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.

Que dois-je faire si php pcntl_signal n'a aucun effet ?

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal