拿到一个100M的文本,要导入到数据库里,通过get_file_contents 和 file($file) ,这种一次性读取所有文本的信息,是不可取的,先不说PHP处理超时问题,就单说运行时所消耗的内存,绝对是几何倍的增长

好了直接上代码

set_time_limit(0); 
ini_set('memory_limit', '-1');//不要限制Mem大小,否则会报错

function read_file($fp,$lin,$offset,$sql){
	$i = 0;                       // 记录读取行数
	fseek($fp, $offset, SEEK_SET);//指针设置在文件开头 
	while(!feof($fp)){
		 $data = fgets($fp);  // 一行一行的读
		 // 根据数据不同,拼接SQL
		 if($data){
			 $arr = explode('-',$data);
			 $arr[1] = (isset($arr[1]) && $arr[1]) ? str_replace("\r\n","",$arr[1]):'';
			 $sql .=  "('{$arr[0]}','{$arr[1]}'),";
			 
		 }
		 // 是否读到指定的行,到了就该递归循环了
		 if($i==$lin){
			 file_put_contents('E:\\data\\sql.sql',$sql,FILE_APPEND); //将SQL记录到文件
			 $sql = '';        // 之前的SQL清空
			 read_file($fp,$lin,ftell($fp),$sql=''); // 递归调用
		 }
		 
		 $i++;
	}
	file_put_contents('E:\\data\\sql.sql',$sql,FILE_APPEND);
}
$file = 'E:\\data\\1.txt';        // 读取文件名
$lin  = 10000;                    // 每次读取行数
$offset = 0;                      // 读取文件时偏移指针,默认从头开始
$sql = "INSERT INTO `XX` (`user`, `pwd`) VALUES";  // SQL 
$fp = fopen($file,"r") or exit('read file error'); // 打开文件

$sql = read_file($fp,$lin,$offset,$sql='');        // 调用方法

fclose($fp);                                       // 关闭文件


在网上看了另一种实现方法,是用PHP自带的类去处理,没验证,需要可以拿去用

还是直接上代码

function readBigFile($filename, $count = 20, $tag = "\r\n") { 
$content = "";//最终内容 
$current = "";//当前读取内容寄存 
$step= 1;//每次走多少字符 
$tagLen = strlen($tag); 
$start = 0;//起始位置 
$i = 0;//计数器 
$handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件起始位置 
while($i < $count && !feof($handle)) { 
fseek($handle, $start, SEEK_SET);//指针设置在文件开头 
$current = fread($handle,$step);//读取文件 
$content .= $current;//组合字符串 
$start += $step;//依据步长向前移动 
//依据分隔符的长度截取字符串最后免得几个字符 
$substrTag = substr($content, -$tagLen); 
if ($substrTag == $tag) { //判断是否为判断是否是换行或其他分隔符 
$i++; 
$content .= "<br />"; 
} 
} 
//关闭文件 
fclose($handle); 
//返回结果 
return $content; 
} 
$filename = "csdn.sql";//需要读取的文件 
$tag = "\n";//行分隔符 注意这里必须用双引号 
$count = 100;//读取行数 
$data = readBigFile($filename,$count,$tag); 
echo $data;