最近写了一段比较不错的代码,记录一下,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;
}