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;
    }
相关推荐
AI大法师1 小时前
Android应用性能监测与调优:掌握Profiler和LeakCanary等关键工具
android
haogexiaole3 小时前
Redis优缺点
数据库·redis·缓存
在未来等你3 小时前
Redis面试精讲 Day 27:Redis 7.0/8.0新特性深度解析
数据库·redis·缓存·面试
新法国菜4 小时前
MySql知识梳理之DML语句
数据库·mysql
老华带你飞4 小时前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站
许泽宇的技术分享4 小时前
Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命
数据库·windows·microsoft
2501_915106325 小时前
iOS混淆工具实战 金融支付类 App 的安全防护与合规落地
android·ios·小程序·https·uni-app·iphone·webview
alexhilton6 小时前
运行时着色器实战:实现元球(Metaballs)动效
android·kotlin·android jetpack
從南走到北7 小时前
JAVA国际版东郊到家同城按摩服务美容美发私教到店服务系统源码支持Android+IOS+H5
android·java·开发语言·ios·微信·微信小程序·小程序
两张不够花8 小时前
Shell脚本源码安装Redis、MySQL、Mongodb、PostgreSQL(无报错版)
linux·数据库·redis·mysql·mongodb·postgresql·云计算