CrontabCommand.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 (Worker $worker) {
  54. $worker->name = 'crontab';
  55. Event::trigger(CrontabWorkerStartEvent::class, $worker);
  56. });
  57. Worker::runAll();
  58. }
  59. }