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

发布于:2025-06-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

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

/**
     * 获取季度报告总结
     * @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);
    }

# 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;
    }

网站公告

今日签到

点亮在社区的每一天
去签到