很好地停止齿轮工人

2022-08-30 11:44:12

我有许多Gearman工人不断运行,保存诸如用户页面浏览记录之类的东西。有时,我会更新 Gearman worker 使用的 PHP 代码。为了让工人切换到新代码,我为工人杀死了PHP进程并重新启动了PHP进程。

什么是更好的方法来做到这一点?据推测,当我杀死其中一个工作进程时,我有时会丢失数据(尽管不是非常重要的数据)。

编辑:我找到了一个适合我的答案,并在下面发布。


答案 1

解决方案 1


通常,我使用带有 -r 标志的 unix 守护程序实用程序运行我的 worker,并让他们在一个作业后过期。您的脚本将在每次迭代后正常结束,守护程序将自动重新启动。

您的员工将因一项工作而陈旧,但这对您来说可能不像丢失数据那么重要

该解决方案还具有释放内存的优点。如果你正在做大量的工作,你可能会遇到内存问题,因为PHP pre 5.3有可怕的GC。

解决方案 2


您还可以向退出脚本的所有工作线程添加 quit 函数。当您想重新启动时,您只需拨打齿轮师电话即可以高优先级退出。


答案 2
function AutoRestart() {
   static $startTime = time();

   if (filemtime(__FILE__) > $startTime) {
      exit();
   }
}

AutoRestart();  

推荐