Gearman Workers se déconnecte périodiquement

J'ai travaillé avec un server de travail Gearman avec de multiples travailleurs qui sont appelés plusieurs fois par jour (10k + x heure) sans aucun problème.

J'ai récemment ajouté 3 nouveaux travailleurs qui ne sont pas appelés souvent (3-6 x jour). Il semble que les nouveaux travailleurs se déconnectent du server gearman à ce qui semble être random (parfois une fois par jour, parfois après avoir terminé un travail), mais laissez le process PHP en cours d'exécution, ce qui signifie qu'il n'y a pas d'erreurs FATAL, ils ne sont plus disponibles que gearman workers.

Le journal des erreurs est principalement correct, mais j'ai vu l'avertissement suivant sur l'un des journaux: Attention: GearmanWorker :: work (): flush (Temporisation de connection expiré) send -> libgearman / connection.cc: 847

Je ne pouvais rien find dans cette question et je voulais poser quelques questions:

1) Qu'est-ce que cette erreur se réfère également? Un timeout de travail, c'est-à-dire qu'un travail a pris trop longtime? ou un timeout du server signifiant qu'il était inactif pendant si longtime qu'il a été déconnecté du server Gearman? Y a-t-il quelque chose qui puisse être corrigé en utilisant GearmanWorker :: setTimeout à -1?

1.1) Si je ne définis pas explicitement le timeout d'attente, est-ce qu'il y a un timeout par défaut par gearman?

2) Les travailleurs de Gearman devraient-ils être redémarrés périodiquement?

3) Est-ce que cela peut être lié à la valeur de return du travailleur? Je returnne toujours boolean, un "faux" déconnecterait le server?

Note: Contrairement à mes autres travailleurs, ces travailleurs sont appelés par les clients comme "faire des antécédents"

Merci pour toute aide!

J'ai récemment rencontré ce problème récemment et je n'ai pas trouvé de solution. J'ai pensé que je publierais mon correctif pour la prochaine personne à find cette page. Dans le code du travail, j'ai ajouté une vérification à la boucle while pour une condition de temporisation et la forcer à quitter le script:

while($worker->work() || $worker->returnCode() == GEARMAN_TIMEOUT) { if($worker->returnCode() == GEARMAN_TIMEOUT) { echo "Timeout.\n"; exit(0); } } 

Ensuite, je garde le script du travailleur en cours d'exécution avec Supervisor. Lorsque le process de superviseur détecte que le script est mort, il recommence automatiquement. Plus de problèmes avec les travailleurs qui se déconnectent. Ce n'est pas très élégant, mais ça a fait du travail.