手把手教你在tp6中实现毫秒级定时任务功能

浏览:14237 发布日期:2019/07/04 分类:ThinkPHP6专区 关键字: tp6 timer 定时任务
导入 workermancomposer 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 参数说明Usage:
  timer [options] [--] <status>

Arguments:
  status                start/stop/reload/status/connections

Options:
      --d               daemon(守护进程)方式启动
      --i[=I]           多长时间执行一次,可以精确到0.001
注册 Timer 命令
修改 console.php 文件'commands' => [
        //定时任务命令
        'timer'=>\app\command\Timer::class,
    ],
启动定时器 php think timer start关闭定时器 php think timer stop-----
高品质的开源项目, 微信商城+小程序商城:
http://github.crmeb.net/u/xaboy
最佳答案
评论( 相关
后面还有条评论,点击查看>>