Переглянути джерело

feat(system): 添加 Workerman 服务支持和 crontab 子进程注册功能

- 新增 WorkerCommand 类用于启动 Workerman 服务器
- 在 GatheringCrontabEventHook 中添加 crontab 专用子进程注册方法
- 集成环境变量检测以适配不同运行环境
- 将系统 worker 命令注册到命令行入口配置中
runphp 3 днів тому
батько
коміт
ea74d5e69b
3 змінених файлів з 42 додано та 0 видалено
  1. 2 0
      command.php
  2. 27 0
      src/Command/WorkerCommand.php
  3. 13 0
      src/Hook/GatheringCrontabEventHook.php

+ 2 - 0
command.php

@@ -6,10 +6,12 @@ use SixShop\System\Command\CoreExtensionConfigCommand;
 use SixShop\System\Command\CrontabCommand;
 use SixShop\System\Command\ExtensionManagementCommand;
 use SixShop\System\Command\ExtensionScaffoldMakeCommand;
+use SixShop\System\Command\WorkerCommand;
 
 return [
     'core:config' => CoreExtensionConfigCommand::class,
     'extension:manage' => ExtensionManagementCommand::class,
     'extension:make' => ExtensionScaffoldMakeCommand::class,
     'crontab' => CrontabCommand::class,
+    'system:worker' => WorkerCommand::class,
 ];

+ 27 - 0
src/Command/WorkerCommand.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SixShop\System\Command;
+
+use think\worker\command\Server;
+use think\worker\Manager;
+
+class WorkerCommand extends Server
+{
+    public function configure(): void
+    {
+        $this->setName('system:worker')
+            ->setDescription('Workerman Server for ThinkPHP (with env detection)');
+    }
+
+    public function handle(Manager $manager)
+    {
+        $envName = getenv('RUNTIME_ENVIRONMENT') ?: '';
+        if (getenv('IS_DDEV_PROJECT') == 'true') {
+            $envName = 'ddev';
+        }
+        $_ENV['ENV_NAME'] = $envName;
+        $manager->start();
+    }
+}

+ 13 - 0
src/Hook/GatheringCrontabEventHook.php

@@ -15,6 +15,8 @@ use SixShop\System\Event\GetCronJobsEvent;
 use SixShop\System\ExtensionManager;
 use think\App;
 use think\facade\Log;
+use think\worker\Manager;
+use think\worker\Worker;
 use Workerman\Crontab\Crontab;
 
 use function SixShop\Core\extension_name_list;
@@ -57,6 +59,17 @@ class GatheringCrontabEventHook
         };
     }
 
+    /**
+     * think-worker 启动时注册 crontab 专用子进程
+     */
+    #[Hook('worker.init')]
+    public function registerCrontabWorker(Manager $manager): void
+    {
+        $manager->addWorker(function (Worker $worker) {
+            $this->app->event->trigger(CrontabWorkerStartEvent::class);
+        }, 'crontab', 1);
+    }
+
     /**
      * @throws \ReflectionException
      */