Maison  >  Article  >  développement back-end  >  Gestion du signal pour les programmeurs PHP

Gestion du signal pour les programmeurs PHP

藏色散人
藏色散人avant
2021-02-04 07:04:083243parcourir

Tutoriel sur le traitement du signal pour les programmeurs PHP

Ce soir, je mangeais du porc braisé, et la fille à table m'a demandé : est-ce comestible ? Moi : Tu peux le manger si tu penses que tu peux. . . Sujets sans rapport avec le contenu

Qu'est-ce qu'un signal

Un signal est un mécanisme de notification (également appelé interruption logicielle) au processus lorsqu'un événement se produit. Lorsqu'un processus reçoit un signal, le noyau met en pause le code en cours d'exécution par le processus et passe à la fonction de traitement du signal correspondante. Si la fonction de traitement ne s'interrompt pas, une fois la fonction de traitement exécutée, l'exécution continuera là où elle a été interrompue. mettre en œuvre.

Lorsque nous écrivons du code en mode FPM, nous ne rencontrerons pas de problèmes liés au traitement du signal, mais comment certains scripts résidant en mémoire en mode CLI peuvent-ils redémarrer, s'arrêter et effectuer un travail de nettoyage avant quitter ( rompre les liens, supprimer les fichiers temporaires, etc.) ?

Exemple de traitement du signal C

Gestion du signal pour les programmeurs PHP

Dans l'image ci-dessus, j'ai enregistré la fonction de traitement SIGINT pour le signal sigint_handle , Après avoir capturé le signal, affichez le contenu et quittez. C'est simple et facile à comprendre. Exécutez gcc -o run run.c && ./run, puis CTRL+C (le signal SIGINT sera déclenché), sortez avec succès : 成功捕获到信号2!, et le programme terminera son exécution directement.

Exemple de traitement du signal PHP

Gestion du signal pour les programmeurs PHP

pcntl_signal est la méthode d'enregistrement du traitement du signal PHP. Les fonctions implémentées ci-dessus sont implémentées en C. fondamentalement la même chose, la différence est que le processus en cours ne se terminera pas et qu'un signinfo supplémentaire est généré (PHP est écrit en C, pourquoi n'y a-t-il aucune information relative au signal en langage C pour le moment ? Parce que PHP utilise un autre signal sigaction, ceux qui sont intéressés peuvent se renseigner)

Le traitement du signal de PHP n'appelle pas directement C

Gestion du signal pour les programmeurs PHP

C'est à ce moment-là que pcntl est initialisé. 🎜>La fonction de gestionnaire enregistrée sous tickpcntl_signal_dispatch

Gestion du signal pour les programmeurs PHP

mettra la fonction de gestionnaire dans la collection de signaux (table de hachage de PHP), et pcntl_signal sera finalement appelée php_signale4Effectuer la gestion du signal sous-jacent. sigaction

Gestion du signal pour les programmeurs PHP

Ici, j'ai omis beaucoup de code et marqué les points clés. En fait, PHP maintient un ensemble de ses propres signaux. Chaque fois que

est appelé, il le fera. demander si s'il y a un signal, le pcntl_signal_dispatch ci-dessus bloquera le signal, de sorte que ce n'est qu'après avoir exécuté le code clé que nous pourrons déclencher la fonction de traitement du signal pour garantir l'intégrité des données et de la logique du programme. SIG_BLOCK

Comment PHP gère les signaux avec élégance

Je vois souvent des programmeurs autour de moi Chaque fois qu'ils ont besoin de redémarrer le processus

, l'astuce qu'ils utilisent est de tuer tous les processus PHP, puis d'en créer de nouveaux. . démarrer. En général, il n'y a pas de problème, mais parfois la tâche d'un certain processus peut ne pas être terminée et il serait un peu impoli de l'interrompre directement. En fait, tant que vous envoyez un signal PHP-FPM au processus maître de PHP, il terminera le traitement de toutes les tâches et redémarrera le processus enfant ~USR2

Gestion du signal pour les programmeurs PHP.

L'image ci-dessus est un exemple que j'ai simplement écrit. Si nous voulons que le processus se termine correctement, il nous suffit d'envoyer le signal

. Il convient de noter que les signaux SIGTERM et SIGKILL ignoreront le blocage du signal et arrêteront directement le processus. De plus, le signal interrompra le sommeil (SLEEP) si SIGSTOP n'est pas exécuté, il renverra le reste. secondes. Il y en a. Vous pouvez l'essayer si vous êtes intéressé. sleep

Il existe en fait de nombreux points de connaissance liés aux signaux, et nous devons continuer à les étudier en profondeur ~ Le code source PHP ci-dessus est la version 7.1.25, et chaque version peut être différente.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer