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

PHP检查文件名是否包含IP地址并获取可用文件名的问题排查

脚本错误原因与修复方案

第一版脚本错误点

  • glob使用不符合需求:glob($ip)仅会在脚本当前执行目录下匹配名称完全等于IP的文件,既没有指定/mnt/dumps/目录,也不能实现「文件名包含IP」的匹配逻辑,和你提前用scandir获取目标目录文件的逻辑也完全重复。
  • 逻辑判断完全错位:代码中只有glob返回非空结果时才会判断结果是否为空,正常情况下永远走不到生成$fpath的分支,同时两层循环的返回逻辑冗余重复,执行顺序混乱。

第二版脚本错误点

  • 正则判断逻辑写反:遍历目录文件时,只要存在任意一个文件不匹配当前IP的命名规则,就会生成对应IP的路径,哪怕已经存在匹配该IP的文件,只要后续有其他文件不匹配,还是会错误生成路径。
  • 变量未重置:遍历下一个IP时,上一个IP生成的$fpath变量没有被销毁,会直接错误返回上一个IP的路径。

修复后可用代码

<?php
function ip_range($start = "10.100.1.2", $end = "10.100.255.254"){
    $start = ip2long($start);
    $end = ip2long($end);
    return array_map('long2ip', range($start, $end));
}

function check_filename(){
    $targetDir = "/mnt/dumps/";
    $ip_address_list = ip_range();
    // 过滤掉scandir返回的.和..特殊目录
    $dir_files = array_filter(scandir($targetDir), function($file){
        return !in_array($file, ['.', '..']);
    });

    foreach($ip_address_list as $ip){
        $ipExists = false;
        $new_ip = preg_quote($ip);
        foreach($dir_files as $file){
            // 只要有一个文件匹配当前IP规则,就标记为已存在,跳出循环
            if(preg_match("/^{$new_ip}_public.{0,10}\.txt/", $file)){
                $ipExists = true;
                break;
            }
        }
        // 该IP没有匹配的文件,生成路径返回
        if(!$ipExists){
            return $targetDir . "{$ip}_public.txt";
        }
    }
    // 所有IP都有对应文件的情况,可根据需求调整返回值
    return null;
};
?>

逻辑说明

  • 先过滤掉scandir返回的.和..特殊目录,避免无效匹配
  • 每个IP遍历前新增$ipExists标记,初始为不存在
  • 遍历文件时只要找到匹配当前IP的文件,就标记为存在并跳出文件循环,减少不必要的遍历
  • 只有当该IP遍历完所有文件都没有匹配项时,才生成对应路径返回

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:54:01