PHP循环二次迭代时file_get_contents抛出无效参数警告求助
解决循环处理JSON文件时
file_get_contents第二次迭代报错的问题 我看你碰到了一个棘手的问题:循环读取多个txt格式的JSON文件,修改后写回,第一次迭代完全正常,但第二次调用file_get_contents($file)就抛出了"Invalid argument"警告,而且你已经确认路径是正确的。咱们一步步排查问题,看看怎么解决。
首先先把你提供的代码整理出来,方便分析:
$sql = "SELECT * FROM dtt_location"; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()){ $path_text=$row['path_text']; $file = $path_text; /*line48 */ $text = file_get_contents($file); $someObject = json_decode($text); $array_object=objectToArray($someObject); $ar_size=sizeof($array_object); $count=0; $array_name[]=""; $array_url[]=""; $skip=0; while($count<$ar_size){ $temp_element=$array_object[$count]; if($temp_element["name"]!=$video_name){ $array_name[$skip]=$temp_element["name"]; $array_url[$skip]=$temp_element["url"]; $skip++; } $count++; } $count=0; $ar_si=$ar_size-1; $create[]=""; while($count<$ar_si) { echo $count; $create[$count]=$first.$array_name[$count]. $second.$array_url[$count].$third; $count++; } $create_j=join(",",$create); $create_j="[".$create_j."]"; if($create_j=="[]"){ $create_j=$text; file_put_contents($file, $create_j); } else { file_put_contents($file, $create_j); } } }
可能的原因分析
- 临时数组未重置导致的数据污染:你代码里的
$array_name、$array_url、$create都是用$array_name[]=""这种方式初始化的,这意味着每次循环都会在原数组的基础上追加内容,而不是清空重置。多次循环后,这些数组里会残留上一次的旧数据,可能导致后续的JSON拼接逻辑出错,甚至间接影响文件操作的稳定性。 - 文件路径存在隐形问题:虽然你确认路径正确,但数据库返回的
path_text可能带有空格、不可见字符或者拼写错误(比如第二次迭代的路径末尾多了个空格),这时候file_get_contents会识别为无效路径。 - 文件资源未正确释放:虽然
file_put_contents默认会自动关闭文件资源,但在某些极端情况下,可能会出现文件句柄未释放的情况,导致下一次读取时文件被锁定。
具体解决方案
1. 重置循环内的临时数组
每次进入循环处理新文件时,先清空临时数组,避免旧数据干扰:
while($row = $result->fetch_assoc()){ // 重置所有临时数组,确保每次循环都是干净的初始状态 $array_name = []; $array_url = []; $create = []; $path_text=$row['path_text']; $file = $path_text; // ... 后续代码保持不变 }
替换掉原来的$array_name[]=""、$array_url[]=""、$create[]="",改成直接初始化空数组。
2. 添加路径有效性检查和调试输出
在调用file_get_contents之前,先检查文件是否存在且可读,同时输出当前路径,确认是否真的有效:
$file = $path_text; // 调试输出当前处理的文件路径,方便排查隐形问题 echo "当前处理文件路径:" . htmlspecialchars($file) . "<br>"; // 检查文件是否存在且可读 if (!file_exists($file) || !is_readable($file)) { echo "警告:文件不存在或无法读取 - " . htmlspecialchars($file) . "<br>"; continue; // 跳过当前文件,继续处理下一个 } $text = file_get_contents($file);
这样就能明确看到第二次迭代时的路径是不是真的没问题,比如有没有多余的空格或者特殊字符。
3. 显式处理文件读写,确保资源释放
把file_put_contents换成显式的fopen/fwrite/fclose操作,确保文件句柄被正确关闭:
// 替换原来的file_put_contents代码块 if($create_j=="[]"){ $create_j=$text; } // 显式打开、写入、关闭文件 $handle = fopen($file, 'w'); if ($handle) { fwrite($handle, $create_j); fclose($handle); } else { echo "无法打开文件进行写入:" . htmlspecialchars($file) . "<br>"; }
这种方式能更可靠地确保文件资源被释放,避免锁定问题。
4. 检查数据库中的路径值
先单独查询数据库里的所有path_text,确认没有无效值:
$sql = "SELECT path_text FROM dtt_location"; $result = $conn->query($sql); echo "数据库中的所有路径:<br>"; while($row = $result->fetch_assoc()){ echo "- " . htmlspecialchars($row['path_text']) . "<br>"; }
看看第二次迭代对应的路径是不是真的存在,有没有拼写错误。
按照上面的步骤排查,应该能解决你的问题,先从重置数组开始试,这个是最可能的原因。
内容的提问来源于stack exchange,提问作者Mubeen Ul Haq
相关产品推荐
相关产品推荐

