瀏覽代碼

fix(worker): 修复工作进程信号处理逻辑

- 在定时任务工作进程中添加 SIGQUIT 信号处理,输出接收信号日志
- 移除定时任务销毁时的单个任务名称输出,统一销毁所有任务
- 在队列工作进程中添加 SIGQUIT 信号处理,设置退出标志
- 将队列工作进程收到退出标记时的日志输出改为直接停止所有工作进程
- 在循环中添加信号分发调用,确保信号能够及时处理
runphp 13 小時之前
父節點
當前提交
101ad197ac
共有 1 個文件被更改,包括 7 次插入5 次删除
  1. 7 5
      src/Command/WorkerCommand.php

+ 7 - 5
src/Command/WorkerCommand.php

@@ -62,10 +62,10 @@ class WorkerCommand extends Command
         SixShopWorker::addWorker(
             onWorkerStart: function (Worker $worker) {
                 pcntl_signal(SIGQUIT, function () {
+                    Worker::safeEcho('crontab worker received SIGQUIT signal'.PHP_EOL);
                     foreach (Crontab::getAll() as $crontab) {
                         /* @var Crontab $crontab */
                         $crontab->destroy();
-                        Worker::safeEcho($crontab->getName().' destroyed'.PHP_EOL);
                     }
                     Timer::delAll();
                     Worker::stopAll();
@@ -96,13 +96,15 @@ class WorkerCommand extends Command
                 $tries = 3;
                 $memoryLimit = 128;  // 内存上限MB
                 $queueWorker = $this->app->get(\think\queue\Worker::class);
-
+                pcntl_signal(SIGQUIT, function () use (&$shouldExit, $worker) {
+                    Worker::safeEcho('queue worker received SIGQUIT signal'.PHP_EOL);
+                    $shouldExit = true;
+                });
                 $run = function () use (&$run, &$shouldExit, $queueWorker, $connection, $queue, $delay, $sleep, $tries, $memoryLimit, $logger, $worker) {
                     if ($shouldExit) {
-                        $logger->info(sprintf("[pid:%d] 收到退出标记,停止消费调度", $worker->pid));
+                        Worker::stopAll();
                         return;
                     }
-
                     try {
                         $queueWorker->runNextJob($connection, $queue, $delay, $sleep, $tries);
                     } catch (\Throwable $e) {
@@ -113,7 +115,7 @@ class WorkerCommand extends Command
                             $e->getTraceAsString()
                         ));
                     }
-
+                    pcntl_signal_dispatch();
                     $usedMb = memory_get_usage(true) / 1024 / 1024;
                     if ($usedMb > $memoryLimit) {
                         $logger->info(sprintf(