最近又遇到一個難緾的客戶,明明在網站后臺已經給他們做了一個積分導入模塊,他們嫌手工導入麻煩,非要做個自動化的,而且要兩套方案、
方案1:他們開放一個內部數據庫,由我們讀取數據并寫到新數據庫里。他們領導說不安全,但是還是讓做,作為備用方案。
方案2:他們將數據定時導出成TXT文本格式,放在一個指定的路徑,我們定時讀取它并解析。由于數據量很大,至少8萬條數據,目前導入的TXT樣本文件達25M,之后的數據會更多,我怕file或file_get_contents函數會吃不消。
在網上找了一下,發現如下方法很是管用。
fseek函數不需要把文件全部裝入內存,而是直接通過指針來操作,所以效率很高。代碼:
$fp = fopen($file, "r");$line = 10;$pos = -2;$t = " ";$data = "";while ($line > 0) { while ($t != "/n") { fseek($fp, $pos, SEEK_END); $t = fgetc($fp); $pos --; } $t = " "; $data .= fgets($fp); $line --;}fclose ($fp);echo $data
www.it165.net
再提升一點,按塊讀取,然后計算塊內的/n標記來算到了多少行。
$fp = fopen($file, "r");$num = 10;$chunk = 4096;$fs = sprintf("%u", filesize($file));$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);for ($len = 0; $len < $max; $len += $chunk) {$seekSize = ($max - $len > $chunk) ? $chunk : $max - $len; fseek($fp, ($len + $seekSize) * -1, SEEK_END); $readData = fread($fp, $seekSize) . $readData; if (substr_count($readData, "/n") >= $num + 1) { preg_match("!(.*?/n){".($num)."}$!", $readData, $match); $data = $match[0]; break; }}fclose($fp);//echo $data;// code to process file contents
有了這個函數,以后用PHP處理大文件就方便了。
PS:那家客戶公司的領導真是有夠龜毛,一個導入功能居然要做三個方案!選定一個不就夠了,非要做那么多,你當買菜呀!
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答