最近又遇到一个难緾的客户,明明在网站后台已经给他们做了一个积分导入模块,他们嫌手工导入麻烦,非要做个自动化的,而且要两套方案、
方案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编程郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答