Mysql
 sql >> Base de données >  >> RDS >> Mysql

Lorsque SIGTERM est envoyé, le processus enfant ferme-t-il la connexion mysql ?

Lorsqu'un processus se termine (soit parce qu'il se termine, soit parce qu'il est terminé à l'aide d'un signal), tous les fichiers et connexions qu'il garde ouverts sont automatiquement fermés par le système d'exploitation. Il n'est pas fermé proprement, en utilisant le protocole MySQL pour fermer les connexions (en supposant qu'il y en ait une). Il est simplement abandonné au niveau TCP/IP et le serveur de l'autre côté découvre qu'il parle à une porte fermée. Cela ne se produit pas toujours instantanément, parfois cela prend un certain temps jusqu'à ce que le serveur remarque que l'interlocuteur est parti. Lorsque cela se produit, il considère la connexion comme abandonnée et nettoie les choses de son côté.

Ne pas ouvrez la connexion MySQL dans le processus parent avant d'utiliser fork() . fork() duplique les structures de données utilisées pour gérer le côté local de la connexion et les résultats sont imprévisibles. De plus, lorsque l'enfant termine (peu importe comment), il ferme la connexion (ou le système d'exploitation la supprime), le serveur MySQL ferme également sa fin et le processus parent découvre qu'il ne parle à personne.

Fermez la connexion MySQL dans le processus parent avant d'utiliser fork() puis ouvrez des connexions distinctes dans le processus parent et dans le processus enfant, si nécessaire.

Enveloppez également toute communication MySQL avec le serveur dans le processus parent entre :

pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));

et

pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));

Sinon, lorsqu'un processus enfant se termine, le processus parent est notifié avec le SIGCHLD signal. Un signal reçu le fait sortir de la veille (s'il a été arrêté dans un sleep() appeler lorsque le signal arrive). La bibliothèque MySQL utilise sleep() dans le cadre du protocole MySQL pour la communication avec le serveur. Si un tel sleep() renvoie de force plus tôt qu'il ne le devrait (à cause d'un signal reçu), la bibliothèque MySQL devient confuse et finit par signaler des erreurs étranges (comme "le serveur MySQL est parti") qui ne sont en fait pas correctes.

Jetez un œil à cette réponse pour une explication détaillée.