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
相关产品推荐
相关产品推荐

