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

优化并发执行批量生成剧集任务方法

lh 1 месяц назад
Родитель
Сommit
5b88c6061e
1 измененных файлов с 11 добавлено и 8 удалено
  1. 11 8
      app/Console/Commands/ProcessBatchEpisodeGenerationCommand.php

+ 11 - 8
app/Console/Commands/ProcessBatchEpisodeGenerationCommand.php

@@ -109,19 +109,22 @@ class ProcessBatchEpisodeGenerationCommand extends Command
         ];
 
         if (DIRECTORY_SEPARATOR === '/') {
-            // Linux:用 nohup 后台启动并立即返回,避免父进程退出时
-            // Symfony Process 析构(stop(0))把子进程一起杀掉
-            $commandLine = 'nohup ' . implode(' ', array_map('escapeshellarg', $command)) . ' > /dev/null 2>&1 &';
-            $process = Process::fromShellCommandline($commandLine);
+            // Linux:用 nohup 后台启动并立即返回。
+            // 使用 exec 而不是 Symfony Process,避免父进程退出时 Process 析构(stop(0))影响子进程;
+            // 子进程输出写入日志文件,便于排查拉起失败的原因。
+            $logFile = storage_path('logs/batch-worker-' . date('Ymd') . '.log');
+            $commandLine = 'nohup ' . implode(' ', array_map('escapeshellarg', $command))
+                . ' >> ' . escapeshellarg($logFile) . ' 2>&1 &';
+            exec($commandLine);
+            dLog('command')->info("拉起子进程命令: " . $commandLine);
         } else {
             // Windows:数组参数直接启动(开发环境)
             $process = new Process($command);
             $process->disableOutput();
+            $process->setTimeout(null);
+            $process->setIdleTimeout(null);
+            $process->start();
         }
-
-        $process->setTimeout(null);
-        $process->setIdleTimeout(null);
-        $process->start();
     }
 
     /**