CrontabCommand.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\System\Command;
  4. use SixShop\System\Event\CrontabWorkerStartEvent;
  5. use think\App;
  6. use think\console\Command;
  7. use think\console\Input;
  8. use think\console\input\Argument;
  9. use think\console\input\Option;
  10. use think\console\Output;
  11. use think\facade\Event;
  12. use Workerman\Worker;
  13. class CrontabCommand extends Command
  14. {
  15. public function configure(): void
  16. {
  17. $this->setName('crontab')
  18. ->addArgument('action', Argument::OPTIONAL, 'action')
  19. ->addOption('daemon', 'd', Option::VALUE_NONE, 'daemon mode')
  20. ->addOption('grace', 'g', Option::VALUE_NONE, 'graceful shutdown')
  21. ->setDescription('Crontab command');
  22. }
  23. protected function execute(Input $input, Output $output): void
  24. {
  25. $argv = [$input->getArgument('action')];
  26. $daemon = $input->getOption('daemon');
  27. if ($daemon) {
  28. $argv[] = '-d';
  29. }
  30. $grace = $input->getOption('grace');
  31. if ($grace) {
  32. $argv[] = '-g';
  33. }
  34. $worker = new class ($argv, $this->app) extends Worker {
  35. private static array $argv;
  36. public function __construct(array $argv, private readonly App $app, ?string $socketName = null, array $socketContext = [])
  37. {
  38. parent::__construct($socketName, $socketContext);
  39. self::$argv = $argv;
  40. self::$pidFile = $app->getRootPath() . 'runtime/crontab.pid';
  41. self::$logFile = $app->getRootPath() . 'runtime/log/' . date('Ymd') . '_crontab.log';
  42. self::$statisticsFile = $app->getRootPath() . 'runtime/crontab_statistics.php';
  43. }
  44. public function setOnWorkerStart(callable $worker): void
  45. {
  46. $this->onWorkerStart = $worker;
  47. }
  48. public static function getArgv(): array
  49. {
  50. return self::$argv;
  51. }
  52. };
  53. $worker->setOnWorkerStart(function () {
  54. Event::trigger(CrontabWorkerStartEvent::class);
  55. });
  56. Worker::runAll();
  57. }
  58. }