tp3.1临时连接指定数据库,切片分类in查询,带过滤需要的数据

最近写了一段比较不错的代码,记录一下,tp3.1临时连接指定数据库,切片分类in查询,带过滤需要的数据

php 复制代码
/**
     * 获取季度报告总结
     * @author Bruce 2025/6/10
     */
    public function getQuarterReportSummarize() {
        // 获取全部数据
        $allData = $this->getAllProtectedDomains();

        if ($allData['code'] != 1) {
            return $this->ajaxError($allData['message']);
        }

        // 分批处理大量数据,每批500个
        $batchSize = 500;
        $result = [];
        $totalDomains = count($allData['list']);

        for ($i = 0; $i < $totalDomains; $i += $batchSize) {
            $batch = array_slice($allData['list'], $i, $batchSize);
            $configs = D('WangZhanDomainHost')->getConfigs($batch);

            foreach ($configs as $key=>$config) {
                $messages = [];
                if (!$config['iswaf']) $messages[] = 'Web漏洞防护未开启';
                if (!$config['cc_switch']) $messages[] = 'CC防护未开启';
                if (!$config['cs_switch']) $messages[] = '爬虫防护未开启';

                if (!empty($messages)) {
                    $result[$key] = implode(',', $messages) . ';';
                }
            }

            // 释放内存
            unset($batch, $configs);
        }

        return $this->ajaxSuccess($result);
    }
php 复制代码
# WangZhanDomainHostModel.class.php
/**
     * 获取配置信息(优化版)
     */
    public function getConfigs($data = [])
    {
        if (empty($data)) return [];

        // 提取所有host和zone组合
        $hosts = [];
        $zones = [];
        $hostZoneMap = [];

        foreach ($data as $item) {
            if (empty($item['host']) || empty($item['zone'])) continue;

            $host = addslashes($item['host']);
            $zone = addslashes($item['zone']);

            $hosts[$host] = $host;
            $zones[$zone] = $zone;
            $hostZoneMap[$host][$zone] = true;
        }

        if (empty($hosts) || empty($zones)) return [];

        // 使用IN查询替代大量OR条件
        $allConfigs = $this->alias('dh')
            ->join('LEFT JOIN anti_cc_config cc ON dh.host = cc.host AND dh.zone = cc.zone')
            ->join('LEFT JOIN anti_cs_config cs ON dh.host = cs.host AND dh.zone = cs.zone')
            ->where([
                'dh.host' => ['IN', array_unique($hosts)],
                'dh.zone' => ['IN', array_unique($zones)],
            ])
            ->field('dh.host, dh.zone, 
                IFNULL(dh.iswaf, 0) as iswaf,
                IFNULL(cc.main_switch, 0) as cc_switch,
                IFNULL(cs.main_switch, 0) as cs_switch')
            ->select();

        // 过滤出真正需要的记录
        $finalConfigs = [];
        foreach ($allConfigs as $config) {
            if (isset($hostZoneMap[$config['host']][$config['zone']])) {
                $finalConfigs[$config['host'].'.'.$config['zone']] = $config;
            }
        }

        return $finalConfigs;
    }
相关推荐
逸Y 仙X23 分钟前
文章二十一:ElasticSearch 词项查询与调度查询实战
java·大数据·数据库·elasticsearch·搜索引擎
李李李勃谦30 分钟前
鸿蒙PCBI 报表工具:连接数据库与可视化报表生成
数据库·华为·交互·harmonyos
shaoming377636 分钟前
检查系统硬件配置是否满足PyCharm最低要求
android·spring boot·mysql
czlczl200209251 小时前
MAX()和MIN()优化
数据库·mysql·性能优化
一起搞IT吧1 小时前
高通Camx功能feature分析之十五:insensor zoom介绍及实现
android·智能手机·相机
消失的旧时光-19432 小时前
SQL 第一篇:CRUD 实战,从 user 表开始写接口
数据库·sql·mysql
aqi002 小时前
一文读懂 HarmonyOS 6.1 带来的十大重要升级
android·华为·harmonyos·鸿蒙·harmony
小江的记录本2 小时前
【Kafka核心】Kafka高性能的四大核心支柱:零拷贝、批量发送、页缓存、压缩
java·数据库·分布式·后端·缓存·kafka·rabbitmq
.小小陈.2 小时前
MySQL 核心基础:数据类型与表约束全解析
数据库·mysql
KmSH8umpK3 小时前
Redis分布式锁进阶第十二篇
数据库·redis·分布式