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

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); 
        } 
    }
}

可能的原因分析

  1. 临时数组未重置导致的数据污染:你代码里的$array_name、$array_url、$create都是用$array_name[]=""这种方式初始化的,这意味着每次循环都会在原数组的基础上追加内容,而不是清空重置。多次循环后,这些数组里会残留上一次的旧数据,可能导致后续的JSON拼接逻辑出错,甚至间接影响文件操作的稳定性。
  2. 文件路径存在隐形问题:虽然你确认路径正确,但数据库返回的path_text可能带有空格、不可见字符或者拼写错误(比如第二次迭代的路径末尾多了个空格),这时候file_get_contents会识别为无效路径。
  3. 文件资源未正确释放:虽然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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:14:11