ThinkPHP6.0中这样实现毫秒级定时任务功能

导入 workerman
php

composer require workerman/workerman
复制代码

建立 Timer 命令

php think make:command Timer
复制代码

实现 Timer

class Timer extends Command
 {
     /**
      * @var int
      */
     protected $timer;
 
    /**
      * @var int|float
      */
     protected $interval = 2;
 
    protected function configure()
     {
         // 指令配置
         $this->setName('timer')
             ->addArgument('status', Argument::REQUIRED, 'start/stop/reload/status/connections')
             ->addOption('d', null, Option::VALUE_NONE, 'daemon(守护进程)方式启动')
             ->addOption('i', null, Option::VALUE_OPTIONAL, '多长时间执行一次')
             ->setDescription('开启/关闭/重启 定时任务');
     }
 
    protected function init(Input $input, Output $output)
     {
         global $argv;
 
        if ($input->hasOption('i'))
             $this->interval = floatval($input->getOption('i'));
 
        $argv[1] = $input->getArgument('status') ?: 'start';
         if ($input->hasOption('d')) {
             $argv[2] = '-d';
         } else {
             unset($argv[2]);
         }
     }
 
    protected function execute(Input $input, Output $output)
     {
         $this->init($input, $output);
 
        //建立定时器任务
         $task = new Worker();
         $task->count = 1;
 
        $task->onWorkerStart = [$this, 'start'];
         $task->runAll();
     }
 
    public function stop()
     {
         //手动暂停定时器
         \Workerman\Lib\Timer::del($this->timer);
     }
 
    public function start()
     {
         $last = time();
         $task = [6 => $last, 10 => $last, 30 => $last, 60 => $last, 180 => $last, 300 => $last];
         
         $this->timer = \Workerman\Lib\Timer::add($this->interval, function () use (&$task) {
             //每隔2秒执行一次
             try {
                 $now = time();
                 foreach ($task as $sec => $time) {
                     if ($now - $time >= $sec) {
                         //每隔$sec秒执行一次
                         $task[$sec] = $now;
                     }
                 }
             } catch (\Throwable $e) {
             }
         });
     }
 

}
复制代码

Timer 参数说明git

Usage:
   timer [options] [--] <status>
 
Arguments:
   status                start/stop/reload/status/connections
 
Options:
       --d               daemon(守护进程)方式启动
       --i[=I]           多长时间执行一次,能够精确到0.001
复制代码

注册 Timer 命令

修改 console.php 文件github

'commands' => [
         //定时任务命令
         'timer'=>\app\command\Timer::class,
     ],
复制代码

 启动定时器小程序

php think timer start
复制代码

 关闭定时器bash

php think timer stop
复制代码

--------微信

高品质的开源项目, 微信商城+小程序商城: github.crmeb.net/u/giteeapp

相关文章
相关标签/搜索