后台处理数据

1.前言

前面小节介绍了如何使用 ThinkPHP 命令行快速生成指定功能的文件,本小节主要介绍如何使用 ThinkPHP 提供的自定义命令行,以后台处理数据为例来介绍自定义命令行的用法。

2.生成自定义命令处理文件

可以使用如下的命令生成一个自定义命令行处理文件:

php think make:command Study test

如下图所示:
图片描述

Tips:php 没有加入环境变量,可以使用绝对路径,如 E:\php\php7.3.4nts\php think version

生成的自定义命令行文件内容如下:

<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;

class Study extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('test')
            ->setDescription('the test command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 指令输出
        $output->writeln('test');
    }
}

3.配置文件加入自定义命令

打开 config\console.php 文件,加入如下内容:

<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
    // 指令定义
    'commands' => [
        'test' => 'app\command\Study'
    ],
];

如下图所示:
图片描述

4.测试自定义命令

输入如下命令可以执行上述自定义命令:

php think test

如下图所示:
图片描述

5.后台处理新增数据

在上述的 execute 方法中,可以实例化一个模型类,然后循环插入数据来模拟自定义命令行来处理新增数据:

    protected function execute(Input $input, Output $output)
    {
        // 指令输出
        $names = ["赵雷","孙空","钱学","王五","张红","李亮"];
        for ($i = 0;$i < 200000;$i++){
            $student = new StudentModel();
            $student->name = $names[mt_rand(0,5)];
            $student->age = mt_rand(18,25);
            $student->id_number = "42011720040506".mt_rand(1000,9999);
            $student->created_at = time();
            $student->save();
        }
        $output->writeln('执行完成');
    }

如下图所示:
图片描述

Tips: 上图内容表示使用命令向学生表插入 20 万条随机学生数据。

再次执行 php think test 命令之后会消耗比较长的时间,耐心等待之后数据库数据如下图所示:
图片描述

Tips: 可以看到使用命令行后台处理数据是不会超时停止的,这是由于使用的是 php 的 CLI 模式。

6.在控制器中使用自定义命令

这里为了演示方便,直接在 app\controller\Indexindex 方法中,加入调用自定义命令的方法:

<?php

namespace app\controller;

use app\BaseController;
use think\facade\Console;

class Index extends BaseController
{
    public function index()
    {
        $output = Console::call('test');

        return $output->fetch();
    }
}

如下图所示:
图片描述

7.小结

本小节主要介绍了如何生成自定义命令行文件,然后配置自定义命令行,定义好自定义命令行文件之后,就可以在该文件中处理业务逻辑了,若想用 php 守护进程后台处理数据,则可以在命令行类中使用 while(1) 在后台不断的跑,例如使用 php 处理消息队列订阅的消息时可以采用这种办法简单的处理。

Tips: 代码仓库:https://gitee.com/love-for-poetry/tp6