2010-09-08 4 views
15

J'ai une boucle foreach qui fourche dedans. Après les chaînes de traitement, il accède à la base de données. Je reçois une erreur:pcntl_fork et la connexion MySQL est partie

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 

La chose est, je me connecte à la base de données après j'ai fourchue.

Ma question: Pourquoi cela se produirait-il?

Si cela se produit, est-ce que j'accède à la base de données avant? L'enfant héritera-t-il des connexions DB? (Note: Je peux écrire du code, mais il est assez grand car tout est dans les classes, ce qui pourrait être à l'origine de ma confusion quand j'accède à la DB. Une autre chose que je devrais savoir c'est que j'utilise ZF .)

+0

Je n'ai pas joué avec Zend Framework mais je me demande s'il conserve une sorte de pool interne de connexions à la base de données. Ou peut-être fait-il des connexions persistantes? Autre que cela, les enfants ne devraient pas hériter des connexions DB ou quoi que ce soit d'autre car ce sont des processus php différents. – Fanis

+0

Ack, je suis corrigé. Ma réponse ci-dessus était basée sur l'intuition mais pas sur l'expérience personnelle car cela n'a pas encore été requis. En lisant plus d'informations, je vois que les enfants fourchus héritent de la connexion db de leurs parents, et c'est un problème connu: http://www.php.net/manual/en/function.pcntl-fork.php#70721 – Fanis

+0

@Fanis - Can vous transformez votre dernier commentaire en une réponse afin que je puisse cliquer sur le grand chèque vert? Merci d'avoir trouvé cette information. Je ne vais pas bifurquer, à la place je vais exécuter un nouveau processus qui aura sa propre connexion db. Il va alors bifurquer, afin de ne pas lier le processus appelant, puis faire son travail dans l'enfant, en enregistrant son pid dans un journal qu'un autre processus cron-started viendra et vérifier s'il a été complété. Hmmmm ... Ça pourrait marcher juste cette fois! Merci! –

Répondre

13

(commentaire -> réponse par la demande de l'utilisateur)

Lire plus dans ce que je vois les enfants fourchues héritent de la connexion db de leurs parents, et il est un problème connu: http://php.net/manual/en/function.pcntl-fork.php#70721

+0

Je pensais juste clarifier: La raison pour laquelle j'ai eu l'erreur même si l'enfant a hérité de la connexion db est que je suis en train de forcer un tas de nouveaux processus qui ont tous besoin d'une connexion DB. –

2

Sauf qu'il est pas un problème . C'est la façon dont pcntl_fork a été conçu. Toute extension (comme l'indique clairement la documentation) qui maintient ses propres descripteurs de fichiers aura alors des descripteurs corrompus car tous les enfants et tous les parents partagent les mêmes descripteurs de fichiers.

0

Vous pouvez éviter la connexion de fermeture lorsque fourchue sortie du processus, si vous tuez processus fourchue avec SIGKILL. La raison de ce comportement, que lorsque PHP est le processus de sortie, que PHP envoie au serveur de base de données "Terminate connexion" commande. Mais le socket ne sera fermé par le système que lorsque tous les liens vers le socket seront fermés. L'utilisation de SIGKILL nous aide à éviter d'envoyer la commande "Terminate connection" au serveur de base de données.