Ну, я отправил этот вопрос, теперь я думаю, что нашел хороший ответ на него.
Если вы заглянете в код для Net_Gearman_Worker, вы обнаружите, что в рабочем цикле отслеживается функция stopWork, и если она возвращает true, она выходит из функции.
Я сделал следующее:
Используя memcache, я создал кэшированное значение gearman_restarttime и использую отдельный скрипт, чтобы установить его в текущую метку времени при каждом обновлении сайта. (Я использовал Memcache, но его можно хранить где угодно - базу данных, файл или что угодно).
Я расширил класс Worker, по сути, до Net_Gearman_Worker_Foo, и заставил всех моих работников это реализовать. В классе Foo я переопределил функцию stopWork, чтобы сделать следующее: во-первых, он проверяет gearman_restarttime; в первый раз он сохраняет значение в глобальной переменной. С тех пор каждый раз он сравнивает кэшированное значение с глобальным. Если он изменился, stopWork возвращает true, и работник завершает работу. Крон проверяет каждую минуту, чтобы увидеть, работает ли каждый работник, и перезапускает любого работника, который ушел.
Возможно, стоит также включить таймер в stopWork и проверять кэш только один раз каждые x минут. В нашем случае Memcache достаточно быстр, так что проверка значения каждый раз не кажется проблемой, но если вы используете какую-то другую систему для сохранения текущей временной метки, проверка реже будет лучше.