后台处理数据
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\Index
的 index
方法中,加入调用自定义命令的方法:
<?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