可能有一些人就听过这样的面试题,做web程序的,的确在类似这样的问题上有很大的思路上的差异。包括我们做批处理的脚本程序,其实和我们普通的web程序是有区别的。后面我会抽出时间通过file_put_contents函数说一下类似的区别。这篇文章说一下操作大文件的处理,一种方式,当然做切割,当然,还有一种方式就是,我们可以通过fseek制定指针读取位置;
示例代码是这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#前面可以通过ini_set将内存设置小一些 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++; } } //关闭文件 fclose($handle); //返回结果 return $content; } $filename = "1.txt";//需要读取的文件 $tag = "\n";//行分隔符 注意这里必须用双引号 $count = 100;//读取行数 $data = readBigFile($filename,$count,$tag);//如果需要处理全部文件内存,此处不能直接赋值,需要改造函数 echo $data; |
上面代码是个示例的代码,读取一个大文件的前多少行,当然如果你需要处理整个文件,不能直接这样用,因为,代码最后还是付给了一个变量,处理这样的问题,就是要复用变量,不能直接全部给这个变量,阶段性的处理,这样这个变量只是不断的重新赋值,每次,都不超过内存的限制。
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/1999/
2016年10月20日 上午 3:56 跨境电商平台 | 引用 | #1
感谢老实分享