真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用PHP怎么遍歷目錄文件和讀取超大文件-創(chuàng)新互聯(lián)

使用PHP怎么遍歷目錄文件和讀取超大文件?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)新羅,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575

遍歷目錄文件


valid()) {
          yield $sub->current();
          $sub->next();
        }
        if ($include_dirs)
          yield $rfile;
      } else {
        yield $rfile;
      }
    }
    closedir($dh);
  }
}

// 使用
$glob = glob2foreach('/var/www');
while ($glob->valid()) {
  
  // 當(dāng)前文件
  $filename = $glob->current();
  
  // 這個(gè)就是包括路徑在內(nèi)的完整文件名了
  // echo $filename;

  // 指向下一個(gè),不能少
  $glob->next();
}

yield 返回的是生成器對(duì)象(不了解的可以先去了解一下 PHP 生成器),并沒(méi)有立即生成數(shù)組,所以目錄下文件再多也不會(huì)出現(xiàn)巨無(wú)霸數(shù)組的情況,內(nèi)存消耗是低到可以忽略不計(jì)的幾十 kb 級(jí)別,時(shí)間消耗也幾乎只有循環(huán)消耗。

讀取文本文件


valid()) {
  
  // 當(dāng)前行文本
  $line = $glob->current();
  
  // 逐行處理數(shù)據(jù)
  // $line

  // 指向下一個(gè),不能少
  $glob->next();
}

通過(guò) yield 逐行讀取文件,具體使用多少內(nèi)存取決于每一行的數(shù)據(jù)量有多大,如果是每行只有幾百字節(jié)的日志文件,即使這個(gè)文件超過(guò)100M,占用內(nèi)存也只是KB級(jí)別。

但很多時(shí)候我們并不需要一次性讀完整個(gè)文件,比如當(dāng)我們想分頁(yè)讀取一個(gè)1G大小的日志文件的時(shí)候,可能想第一頁(yè)讀取前面1000行,第二頁(yè)讀取第1000行到2000行,這時(shí)候就不能用上面的方法了,因?yàn)槟欠椒m然占用內(nèi)存低,但是數(shù)以萬(wàn)計(jì)的循環(huán)是需要消耗時(shí)間的。

這時(shí)候,就改用 SplFileObject 處理,SplFileObject 可以從指定行數(shù)開(kāi)始讀取。下面例子是寫(xiě)入數(shù)組返回,可以根據(jù)自己業(yè)務(wù)決定要不要寫(xiě)入數(shù)組,我懶得改了。

seek($offset); 

  $i = 0;
  
  while (! $fp->eof()) {
    
    // 必須放在開(kāi)頭
    $i++;
    
    // 只讀 $count 這么多行
    if ($i > $count)
      break;
    
    $line = $fp->current();
    $line = trim($line);

    $arr[] = $line;

    // 指向下一個(gè),不能少
    $fp->next();
  }
  
  return $arr;
}

以上所說(shuō)的都是文件巨大但是每一行數(shù)據(jù)量都很小的情況,有時(shí)候情況不是這樣,有時(shí)候是一行數(shù)據(jù)也有上百M(fèi)B,那這該怎么處理呢?

如果是這種情況,那就要看具體業(yè)務(wù)了,SplFileObject 是可以通過(guò) fseek 定位到字符位置(注意,跟 seek 定位到行數(shù)不一樣),然后通過(guò) fread 讀取指定長(zhǎng)度的字符。

也就是說(shuō)通過(guò) fseek 和 fread 是可以實(shí)現(xiàn)分段讀取一個(gè)超長(zhǎng)字符串的,也就是可以實(shí)現(xiàn)超低內(nèi)存處理,但是具體要怎么做還是得看具體業(yè)務(wù)要求允許你怎么做。

復(fù)制大文件


順便說(shuō)下 PHP 復(fù)制文件,復(fù)制小文件用 copy 函數(shù)是沒(méi)問(wèn)題的,復(fù)制大文件的話(huà)還是用數(shù)據(jù)流好,例子如下:

關(guān)于使用PHP怎么遍歷目錄文件和讀取超大文件問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


當(dāng)前文章:使用PHP怎么遍歷目錄文件和讀取超大文件-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/cooish.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部