数据库 - Model 前置说明
官方开源项目 抓取代理IP

对象模型

对标Driver表,存储位置:\app\uml\Driver.php

namespace app\uml;
use x\redis\UML;

class Driver extends UML
{
    /**
     * 使用的Redis连接池标识
    */
    protected $driver = 'default';
    /**
     * 使用哪个Redis表存储
    */
    protected $database = 12;
    /**
     * 是否开启回写记录
    */
    protected $timer = true;
    /**
     * 主键字段
    */
    protected $primary = 'id';
    /**
     * 建模必传对象
    */
    protected $field_rule = [
        'id', // 主键值
        'driver_sn', // 编号
        'status', // 状态  1.在线空闲 2.在线工作中  3.离线
        'region_id', // 地区ID
        'real_name', // 真实姓名
        'lng', // 经度
        'lat', // 纬度
        'add_time', // 添加时间
    ];
    /**
     * 普通查询规则
    */
    protected $query_rule = [
        'id' => ['equal'], // 等于查询
        'status' => ['equal'], // 等于查询
        'region_id' => ['equal', 'range'], // 等于查询 OR 范围查询
        'driver_sn' => ['equal'], // 等于查询
        'real_name' => ['equal'], // 等于查询
        'add_time' => ['range'], // 日期查询
    ]; 
    /**
     * geo配置规则
    */
    protected $geo_rule = [
        'longitude' => 'lng', // 经度
        'latitude' => 'lat', // 纬度
    ];
}

创建测试数据

HTTP控制器:

namespace app\http;
use x\controller\Http;
use app\uml\Driver;

class Index extends Http
{
    /**
     * @RequestMapping(route="/test1")
    */
    public function index() {
        // 生成随机数据
        $all = [];
        $time = time();
        // 10W测试
        for ($i=0; $i<=100000; $i++) {
            $all[] = [
                'id' => ($i+1),
                'status' => rand(1, 3),
                'driver_sn' => substr(md5($i), 0, 2).$i,
                'region_id' => rand(100, 200),
                'real_name' => \x\built\Str::randChinese(),
                'lng' => \x\common\Money::randomFloat(113.100000, 116.999999, 6),
                'lat' => \x\common\Money::randomFloat(23.100000, 25.999999, 6),
                'add_time' => $time+$i,
            ];
        }
        $Driver = new Driver();
        $num = $Driver->insertAll($all, 5000);
        return $this->fetch($num);
    }
}

建议:测试上面脚本用的3核+8G的机器,如果配置更差的同学记得自己修改测试量,不要逞强。

查询测试

HTTP控制器:

namespace app\http;
use x\controller\Http;
use app\uml\Driver;

class Index extends Http
{
    /**
     * @RequestMapping(route="/test2")
    */
    public function index() {
        $html = '';
        
        // 统计耗时
        $StartTime = microtime(true);
        
        
        $Driver = new Driver();
        // 查询ID等于3的数据
        $info = $Driver->id(3)->find(); 
        $html .= '场景一:'.dd($info);
        // 将其修改为工作中
        $res = $Driver->id(3)->update([
            'status' => 2
        ]);
        $html .= '场景二:'.dd($res);
        // 查询在线,并且地区在150的司机
        $list = $Driver->where('status', [1, 2])->where('region_id', 150)->select(); 
        $html .= '场景三:'.dd(count($list));
        // 查询在线,并且地区在150,同时要是姓林的司机
        $list = $Driver->where('status', [1, 2])->where('region_id', 150)->like('real_name', '林', '%s')->select(); 
        $html .= '场景四:'.dd(count($list));
        // 查询在线,并且在geo半径5公里内,地区在100 - 120 之间的司机
        $list = $Driver->geo(113.402618, 23.149329, 5)->where('status', [1, 2])->where('region_id', 'range', [100, 120])->select(); 
        $html .= '场景五:'.dd(count($list));
        
        $StopTime = microtime(true);  
        $TimeSpent=$StopTime-$StartTime;
        $html .= dd('上述查询总耗时:'.number_format($TimeSpent*1000, 4).'毫秒');

        return $this->fetch($html); 
    }
}

耗时结果:

SW-X

企业级 - 高性能 PHP 框架

最后更新:2年前 . 作者-小黄牛

本篇目录