You need to enable JavaScript to run this app. PHP foreach循环如何重置DOMDocument避免loadHTMLFile内容累积
优惠活动
大模型
产品
解决方案
定价
更多

PHP foreach循环如何重置DOMDocument避免loadHTMLFile内容累积

核心问题定位
  • 不存在DOMDocument实例本身的内容累积:你在foreach循环内new DOMDocument()已经生成了独立的空白实例,观察到的内容混杂来自三个隐藏逻辑缺陷
  • $urls_to_image数组未在每轮循环开头初始化:第一轮抓取的图片地址会留存到变量中,第二轮循环直接叠加新结果,导致下载逻辑混入上一轮的旧地址
  • 多余的$document->loadHTMLFile('')空加载逻辑无效:该操作不会清空DOMDocument,反而可能触发libxml底层的解析异常,导致非标准HTML的解析结果混杂
  • libxml底层上下文未隔离:批量解析非标准HTML时,未禁用外部资源加载、未重置错误缓冲,可能触发底层解析状态残留
修正方案
  • 每轮循环开头显式重置$urls_to_image为空数组,切断上轮变量残留
  • 移除无效的空loadHTMLFile调用,避免触发解析异常
  • 加载HTML前通过libxml配置禁用外部加载、清除错误缓冲,隔离底层状态
  • 解析完成后主动unsetDOM、XPath实例,避免内存占用与状态残留
修正后可运行代码
$responses = [
    "warsztaty" => "http://www.barlewiczki.pl/index.php/galeria/category/29-um-warsztaty-2018",
    "rozpoczecie_roku_szkolnego" => "http://www.barlewiczki.pl/index.php/galeria/category/36-rozpoczecie-roku-szkolnego-2018-2019"
];

foreach($responses as $key=>$response) {
    // 每轮开头重置图片地址数组,避免上轮内容残留
    $urls_to_image = [];
    // 禁用libxml外部加载、屏蔽解析警告,隔离底层状态
    libxml_use_internal_errors(true);
    libxml_clear_errors();

    $document = new DOMDocument();
    // 跳过空加载逻辑,直接加载目标URL
    $document->loadHTMLFile($response);
    
    $xpath = new DOMXpath($document);
    $imgs = $xpath->query("//a[contains(@class, 'shadowbox-button')]");
    for ($i=0; $i < $imgs->length; $i++) {
        $img = $imgs->item($i);
        $src = $img->getAttribute("href");
        $urls_to_image[] =  'http://www.barlewiczki.pl' . $src;
    }

    // 目标存储文件夹结构
    $my_save_dir =  'zdjecia_barlewiczki/' . $key . '/';
    // 先确保根目录存在,再递归创建子目录
    if (!is_dir('zdjecia_barlewiczki')) {
        mkdir('zdjecia_barlewiczki', 0777, true);
    }
    if (!is_dir($my_save_dir)) {
        mkdir($my_save_dir, 0777, true);
    }

    foreach ($urls_to_image as $url) {
        $ch = curl_init($url);
        $filename = basename($url);
        $complete_save_loc = $my_save_dir . $filename;
        $fp = fopen($complete_save_loc, 'wb');
        
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);
    } 
    // 主动释放DOM实例,避免内存泄漏
    unset($document, $xpath, $imgs);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 07:15:04