You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PHP 8优化海量来源域名黑名单的内容显示/隐藏方案

PHP 8 下处理万级域名黑名单的高效实现方案

针对你当前用多条件||判断处理黑名单的方式,当域名数量达到12000+时,会因逐个匹配导致性能线性下降(时间复杂度O(n)),以下是PHP 8下更高效的优化方案:

核心思路:利用哈希表(关联数组)实现O(1)查找

PHP的关联数组底层基于哈希表实现,键值查找的时间复杂度为O(1),相比逐个||判断的线性遍历,性能提升极其明显。

1. 重构黑名单存储

将所有黑名单域名存入关联数组(键为域名,值设为true即可),建议单独放在配置文件中便于维护,比如创建domain_blacklist.php:

<?php
return [
    'validcodes.net' => true,
    'coupons4shopping.org' => true,
    'us.buybuylife.com' => true,
    'couponsgo.org' => true,
    // ... 其余12000+域名
];

2. 优化判断逻辑

在业务代码中加载黑名单数组,直接通过键存在性判断域名是否在黑名单内:

<?php
// 加载黑名单数组(可配合OPcache缓存,避免每次请求重新解析)
$blacklist = require __DIR__ . '/domain_blacklist.php';

$referrerdomain = $_GET['referrer'] ?? '';
// 先判断域名非空,再检查是否在黑名单中
$isInBlacklist = !empty($referrerdomain) && isset($blacklist[$referrerdomain]);

// 控制内容显示的类名
$showOrHideClass = $isInBlacklist ? 'hideme' : 'showme';
?>

<div class="<?php echo $showOrHideClass; ?>">
    <p>Show stuff</p>
</div>

3. 进一步性能优化

  • 启用OPcache:PHP 8默认支持OPcache,开启后会将domain_blacklist.php编译后的内容缓存到内存,避免每次请求都读取文件并解析数组,大幅提升加载速度。
  • 批量导入域名:如果黑名单域名来自外部文件(如CSV),可以一次性读取并转换为关联数组,避免手动维护数组:
    // 从CSV文件读取黑名单域名并生成关联数组
    $blacklist = array_flip(array_map('trim', file(__DIR__ . '/blacklist.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)));
    
    这里array_flip会将数组的元素转为键,值为原索引,同样可以用isset()快速判断。

注意事项

  • 原代码的逻辑存在优先级问题:&&的优先级高于||,导致原判断逻辑实际是($referrerdomain !== '' && $referrerdomain == "validcodes.net") || 其他域名匹配,这会出现“域名为空但后续某个域名匹配时也判定为黑名单”的错误,重构后的代码已经修正了这个逻辑。
  • 若实际场景是获取HTTP来源域名,建议使用$_SERVER['HTTP_REFERER']而非$_GET['referrer'],但需注意该字段可能被浏览器或代理篡改。

内容的提问来源于stack exchange,提问作者rivitzs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:15