J'ai posté cette question et je pense maintenant avoir trouvé une bonne réponse.
Si vous regardez dans le code de Net_Gearman_Worker, vous verrez que dans la boucle de travail, la fonction stopWork est contrôlée, et si elle renvoie vrai, elle quitte la fonction.
J'ai fait ce qui suit :
À l'aide de memcache, j'ai créé une valeur en cache, gearman_restarttime, et j'utilise un script distinct pour définir cette valeur à l'horodatage actuel chaque fois que je mets à jour le site. (J'ai utilisé Memcache, mais cela pourrait être stocké n'importe où - une base de données, un fichier, ou n'importe quoi).
J'ai étendu la classe Worker pour qu'elle soit, essentiellement, Net_Gearman_Worker_Foo, et j'ai fait en sorte que tous mes workers l'instancient. Dans la classe Foo, j'ai surchargé la fonction stopWork pour faire ce qui suit : d'abord, elle vérifie gearman_restarttime ; la première fois, elle enregistre la valeur dans une variable globale. Ensuite, à chaque passage, elle compare la valeur mise en cache à la variable globale. Si elle a changé, le stopWork retourne vrai, et le travailleur quitte. Un cron vérifie toutes les minutes si chaque worker est toujours en cours d'exécution, et redémarre tout worker qui s'est arrêté.
Il peut être intéressant de mettre une minuterie dans stopWork également, et de ne vérifier le cache qu'une fois toutes les x minutes. Dans notre cas, Memcache est suffisamment rapide pour que la vérification de la valeur à chaque fois ne semble pas être un problème, mais si vous utilisez un autre système pour stocker l'horodatage actuel, une vérification moins fréquente serait préférable.