Просмотр исходного кода

fix(worker): 修复定时任务工作进程停止逻辑

- 将部署脚本中的工作进程重载命令改为停止命令
- 添加 SIGQUIT 信号处理器用于优雅关闭定时任务
- 实现定时任务销毁机制释放资源
- 添加心跳保活机制确保信号及时处理
- 集成 Workerman 定时任务模块支持信号调度
runphp 16 часов назад
Родитель
Сommit
7482c77de2
1 измененных файлов с 14 добавлено и 0 удалено
  1. 14 0
      src/Command/WorkerCommand.php

+ 14 - 0
src/Command/WorkerCommand.php

@@ -11,6 +11,7 @@ use think\console\input\Argument;
 use think\console\input\Option;
 use think\console\input\Option;
 use think\console\Output;
 use think\console\Output;
 use SixShop\System\Workerman\Worker as SixShopWorker;
 use SixShop\System\Workerman\Worker as SixShopWorker;
+use Workerman\Crontab\Crontab;
 use Workerman\Timer;
 use Workerman\Timer;
 use Workerman\Worker;
 use Workerman\Worker;
 
 
@@ -60,7 +61,20 @@ class WorkerCommand extends Command
     {
     {
         SixShopWorker::addWorker(
         SixShopWorker::addWorker(
             onWorkerStart: function (Worker $worker) {
             onWorkerStart: function (Worker $worker) {
+                pcntl_signal(SIGQUIT, function () {
+                    foreach (Crontab::getAll() as $crontab) {
+                        /* @var Crontab $crontab */
+                        $crontab->destroy();
+                        Worker::safeEcho($crontab->getName().' destroyed'.PHP_EOL);
+                    }
+                    Timer::delAll();
+                    Worker::stopAll();
+                });
                 $this->app->event->trigger(CrontabWorkerStartEvent::class, $worker);
                 $this->app->event->trigger(CrontabWorkerStartEvent::class, $worker);
+                // 心跳兜底,每秒一次
+                new Crontab('*/1 * * * * *', function () {
+                    pcntl_signal_dispatch();
+                }, 'signal-heartbeat');
             },
             },
             name: 'crontab',
             name: 'crontab',
             count: 1,
             count: 1,