日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php写入大文件内容_用PHP读取超大文件的实例代码

發(fā)布時間:2025/3/20 php 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php写入大文件内容_用PHP读取超大文件的实例代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)據(jù)量大帶來的問題就是單個文件很大,能夠打開這個文件相當(dāng)不容易,記事本就不要指望了,果斷死機(jī)

去年年底的各種網(wǎng)站帳號信息的數(shù)據(jù)庫泄漏,很是給力啊,趁機(jī)也下載了幾個數(shù)據(jù)庫,準(zhǔn)備學(xué)學(xué)數(shù)據(jù)分析家來分析一下這些帳號信息。雖然這些數(shù)據(jù)信息都已經(jīng)被“整理”過的,不過自己拿來學(xué)習(xí)也挺有用的,畢竟有這么大的數(shù)據(jù)量。

數(shù)據(jù)量大帶來的問題就是單個文件很大,能夠打開這個文件相當(dāng)不容易,記事本就不要指望了,果斷死機(jī)。用MSSQL的客戶端也打不開這么大的SQL文件,直接報內(nèi)存不足,原因據(jù)說是MSSQL在讀取數(shù)據(jù)的時候,是一次性地將讀取到的數(shù)據(jù)放在內(nèi)存中,如果數(shù)據(jù)量過大,而內(nèi)存不足,則會直接導(dǎo)致系統(tǒng)癱掉。

Navicat Premium

這兒推薦一個軟件Navicat Premium,相當(dāng)給力啊,幾百兆的SQL文件輕松就打開了,一點都不卡。而且這個客戶端軟件支持MSSQL、MYSQL、Oracle……等等各種數(shù)據(jù)庫的連接,其它的很多功能就自己慢慢研究了。

雖然用Navicat可以打開CSDN這個274MB的SQL文件,但是內(nèi)容卻是沒意義的,而且也不方便對這些帳號信息進(jìn)行查詢、分類、統(tǒng)計等等操作。唯一的方法就是把這些數(shù)據(jù)一條一條地讀取出來,然后分拆每條記錄的不同片段,再將這些片段以數(shù)據(jù)字段的格式存入數(shù)據(jù)庫,這樣就可以方便以后的使用了。

使用PHP讀取超大文件

PHP有很多種文件讀取的方式,根據(jù)目標(biāo)文件的不同,采取更合適的方法,可有效地提高執(zhí)行效率。由于CSDN數(shù)據(jù)庫文件很大,所以我們盡量不在短時間內(nèi)全都讀取出來,畢竟每讀取一條數(shù)據(jù)還要對其分拆和寫入操作。那么比較合適的方式就是對文件進(jìn)行分區(qū)域地讀取,通過使用PHP的fseek和fread相結(jié)合,即可做到隨意讀取文件中的某一部份數(shù)據(jù),下面是實例代碼:

function readBigFile($filename, $count = 20, $tag = "\r\n") {

$content = "";//最終內(nèi)容

$current = "";//當(dāng)前讀取內(nèi)容寄存

$step= 1;//每次走多少字符

$tagLen = strlen($tag);

$start = 0;//起始位置

$i = 0;//計數(shù)器

$handle = fopen($filename,'r+');//讀寫模式打開文件,指針指向文件起始位置

while($i < $count && !feof($handle)) {

fseek($handle, $start, SEEK_SET);//指針設(shè)置在文件開頭

$current = fread($handle,$step);//讀取文件

$content .= $current;//組合字符串

$start += $step;//依據(jù)步長向前移動

//依據(jù)分隔符的長度截取字符串最后免得幾個字符

$substrTag = substr($content, -$tagLen);

if ($substrTag == $tag) { //判斷是否為判斷是否是換行或其他分隔符

$i++;

$content .= "
";

}

}

//關(guān)閉文件

fclose($handle);

//返回結(jié)果

return $content;

}

$filename = "csdn.sql";//需要讀取的文件

$tag = "\n";//行分隔符 注意這里必須用雙引號

$count = 100;//讀取行數(shù)

$data = readBigFile($filename,$count,$tag);

echo $data;

關(guān)于函數(shù)傳入的變量$tag的值,根據(jù)系統(tǒng)不一樣,傳入的值也是有區(qū)別的:Windows用”\r\n”,linux/unix用”\n”,Mac OS用”\r”。

程序執(zhí)行的大概流程:先定義讀取文件的一些基礎(chǔ)變量,然后打開文件,將指針定位在文件的指定位置,并讀取指定大小的內(nèi)容。每讀取一次將內(nèi)容存儲在變量中,直到達(dá)到讀取要求的行數(shù)或文件結(jié)束。

絕不要假定程序中的一切都將按計劃運行。

根據(jù)上面的代碼,雖然能夠得到文件中指定位置、指定大小的數(shù)據(jù),但這整個過程只執(zhí)行了一次,并不能得到所有的數(shù)據(jù)。其實要得到所有的數(shù)據(jù),可以在這個循環(huán)的外層再添加判斷文件是否結(jié)束的循環(huán),但這很浪費系統(tǒng)資源,甚至由于文件過大一直沒法讀完而導(dǎo)致PHP執(zhí)行超時。另一種方法就是記錄并存儲上次讀取數(shù)據(jù)后指針?biāo)诘奈恢?#xff0c;然后再次執(zhí)行該循環(huán)的時候,將指針定位在上次結(jié)束的位置,這樣就不存在一次循環(huán)要把文件從頭讀到尾的情況。

其實CSDN這個數(shù)據(jù)庫我到現(xiàn)在都還沒有導(dǎo)入數(shù)據(jù)庫,因為當(dāng)時泄漏后沒幾天CNBETA上就有一個分析了,呵呵,動作太快了。當(dāng)看到別人已經(jīng)做了這個事之后,自動就沒有多少動力來做了,不過為了學(xué)習(xí),還是要抽時間把這個事完成了。

總結(jié)

以上是生活随笔為你收集整理的php写入大文件内容_用PHP读取超大文件的实例代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。