㈠ 怎样用PHP逐行读取数G的大文件最有效率且不会搞爆内存
你需要安装php运行环境,才能解析php文件!网络phpstudy!一键安装,然后把php放在phpstudy的网站目录!然后就可以用sublime编写!然后测试! 要直接sublime+浏览器只可以运行html+script! 欢迎拍砖
㈡ php如何高效的读取大文件
1. 直接采用file函数来操作由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制2.直接调用Linux的 tail 命令来显示最 后几行在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令3. 直接使用PHP的 fseek 来进行文件操作这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的
㈢ php处理大文件文件
我前几天有一个面试,面试题就是有这样一道题。先把自己的思路说一下,因为信息量非常的大,所以我采用了分表,分成24张表,每个小时一张,虽然凌晨时刻的表可能很少数据,但这样sum字段的问题就容易解决了,我理解的sum字段是一个小时同一个用户在相同的环境的登陆次数。这样理解不知对否,请网友自行甄辨。然后我通过PHP中的fgets函数一行一行的数据取出,入表。实验了几万条数据是没有问题的,但是上亿条数据可能够呛。这一点也请网友注意,我也是新手。只是看到这里没有答案,给大家一个参考。废话不多,看流程:
日志文件(access.log)格式:
200/alipeng.gif?zoneid=2&bannerid=44&clentid=6&materialid=64&redirect=http%3a%2f%2fwww.alipeng.cn&time=1384444800.832&ip=127.0.0.1&user_agent=Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.48Safari/537.36&utrace=502/alipeng.gif?zoneid=2&bannerid=44&clentid=6&materialid=64&redirect=http%3a%2f%2fwww.alipeng.org&time=1384444800.904&ip=127.0.0.1&user_agent=Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.48Safari/537.36&utrace=
配置文件cfg.php:
define(HOST,'localhost');//主机名define(USER,'root');//数据库账号define(PASS,'111111');//数据库密码define(DBNAME,'test');//所用的数据库define(CHARSET,'utf8');//使用的字符集
具体代码test.php:
<?phpheader("content-type:text/html;charset=utf-8");require'./cfg.php';$link=mysql_connect(HOST,USER,PASS)ordie('连接数据库失败');//程序中自动建库和建表,这样一定程度上拖慢了程序的速度//创建数据库$crdb="createdatabaseifnotexists".DBNAME;if(!mysql_query($crdb)){die('创建数据库失败');}//链接数据库mysql_select_db(DBNAME)ordie('选择数据库失败');mysql_set_charset(CHARSET);//因为数据量很大我将数据按小时分表,分成24个表,每小时一个表,这样num字段的值也好做统计//数据循环建表for($i=0;$i<24;$i++){if($i<10){$tbhz='0'.$i;//如果前10张表,表后缀应该是00-09}else{$tbhz=$i;}$ctbsql="_{$tbhz}(idintnotnullauto_incrementprimarykey,zoneidintnotnulldefault0,banneridintnotnulldefault0,clentidintnotnulldefault0,materialidintnotnulldefault0,redirectchar(200)notnulldefault'',timechar(16)notnulldefault'',user_agentchar(200)notnulldefault'',utracechar(32)notnulldefault'',sumintnotnulldefault0)TYPE=_general_ci";mysql_query($ctbsql);}//打开文件$file=fopen("./access.log",'r')ordie("打开文件失败");//对文件内容进行循环,直到文件末尾才停止while(!feof($file)){//每次读取一行$line=fgets($file,1024);//状态是200的进行写入数据库操作if(preg_match('/^200/',$line)){$pinfo=parse_url($line);//url信息$ext=$pinfo['query'];//取得传递的各个参数$parray=explode('&',$ext);//根据&分解为数组//因为分解为数组后并不是要的值,所以要对值进行一次截取,将等号及等号左边的都去掉foreach($parrayas$val){$narray[]=ltrim(strstr($val,'='),'=');}$narray[8]=rtrim($narray[8],'_');//截取时间的秒数$getmun=substr($parray[5],5,10);$time=date('Y-m-dH',$getmun);//将秒数转化为时间类型。//得到表后缀$tbhz=date('H',$getmun);$sql="insertintologininfo_{$tbhz}values(null,'{$narray[0]}','{$narray[1]}','{$narray[2]}','{$narray[3]}','{$narray[4]}','{$time}','{$narray[7]}','{$narray[8]}',0)";//echo$sql;$res=mysql_query($sql);//执行插入if(!$res||!mysql_affected_rows()>0){die('写入数据库失败');}unset($narray);//循环一次将narray销毁,为下一次循环做准备//var_mp(parse_url($line)['query']);}}fclose($file);//关闭//因为sum字段还是0,下面代码段需要处理sum字段的值//24张表循环处理for($i=0;$i<24;$i++){if($i<10){$tbhz='0'.$i;//如果前10张表,表后缀应该是00-09}else{$tbhz=$i;}//该sql语句是把同一个小时内,并且符合条件相等的登陆的总次数和需要的登陆信息查出,为下面修改sum做准备$sql="SELECTCOUNT('zoneid')ASsum,zoneid,bannerid,clentid,materialid,redirect,user_agent,utraceFROMlogininfo_{$tbhz}GROUPBYzoneid,bannerid,clentid,materialid,redirect,user_agent,utrace";//发送查询sql$res=mysql_query($sql);if($res&&mysql_num_rows($res)>0){while($row=mysql_fetch_assoc($res)){//修改sum字段,即同一小时内的登陆次数$upsql="updatelogininfo_{$tbhz}setsum='{$row['sum']}'wherezoneid='{$row['zoneid']}'andbannerid='{$row['bannerid']}'andclentid='{$row['clentid']}'andmaterialid='{$row['materialid']}'andredirect='{$row['redirect']}'anser_agent='{$row['user_agent']}'antrace='{$row['utrace']}'";//发送修改sql,执行修改sum$upres=mysql_query($upsql);if(!$upres){die('修改登陆sum失败');}}}}echo'数据成功入表';
使用说明:
将配置文件cfg.php中的连接数据库账号、密码修改为自己本机的(默认新增的库名是test)
直接运行test1.php
㈣ PHP如何对CSV大文件进行读取并导入数据库
fgetcsv 可以读取fopen打开的文件,并读取一行,这样可以防止文件太大而内存溢出然后每读取一定行数,入库一次,
㈤ php读取txt文件的内容是txt文件太大了怎么办
<? // 打开文件同时,打印每一行 $myFile = file( "100001.txt");//用file()函数读取文本文件的内容。 for($index = 0; $index < count($myFile); $index++) { print($myFile[$index]." ");//循环输出 } ?>修改如下:$myFile = file( "100001.txt");//用file()函数读取文本文件的内容。 //设置分页 $page=is_numeric($_REQUEST['page'])?$_REQUEST['page']:1; $page_size=3;//每页显示三行 //第一页,显示1-3行,对应的for循环起止条件是0-3 //第二页,显示4-6行,对应的for循环起止条件是3-6 //可以看出for循环的条件分别是首项为0与首项为3,公差为3的等差数列,以下分别是公式 $off=3*($page-1); $off_size=3*$page; $total_page=ceil(count($myFile)/$page_size);//总页数 // 打开文件同时,打印每一行 for($index = $off; $index < $off_size; $index++){ echo iconv('gb2312','utf-8',$myFile[$index])."<br>";//循环输出 }
㈥ php如何读取文本指定的内容
php读取文件内容:—–第一种方法—–fread()——–<?php$file_path = "test.txt";if(file_exists($file_path)){$fp = fopen($file_path,"r");$str = fread($fp,filesize($file_path));//指定读取大小,这里把整个文件内容读取出来echo $str = str_replace("\r\n","<br />",$str);}?>——–第二种方法————<?php$file_path = "test.txt";if(file_exists($file_path)){$str = file_get_contents($file_path);//将整个文件内容读入到一个字符串中$str = str_replace("\r\n","<br />",$str);echo $str;}?>—–第三种方法————<?php$file_path = "test.txt";if(file_exists($file_path)){$fp = fopen($file_path,"r");$str = "";$buffer = 1024;//每次读取 1024 字节while(!feof($fp)){//循环读取,直至读取完整个文件$str .= fread($fp,$buffer);} $str = str_replace("\r\n","<br />",$str);echo $str;}?>——-第四种方法————–<?php$file_path = "test.txt";if(file_exists($file_path)){$file_arr = file($file_path);for($i=0;$i<count($file_arr);$i++){//逐行读取文件内容echo $file_arr[$i]."<br />";}/*foreach($file_arr as $value){echo $value."<br />";}*/}?>—-第五种方法——————–<?php$file_path = "test.txt";if(file_exists($file_path)){$fp = fopen($file_path,"r");$str ="";while(!feof($fp)){$str .= fgets($fp);//逐行读取。如果fgets不写length参数,默认是读取1k。}$str = str_replace("\r\n","<br />",$str);echo $str;}?>
㈦ php 如何读取大文件里的内容
由于PHP的file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟专糕的程序占用太多属的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下 限制只能最大使用内存16M,这是通过php.ini里的memory_limit = 16M来进行设置,这个值如果设置-1,则内存使用量不受限制.可以使用php的fseek来进行文件操作,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,效率较高.
㈧ php如何读取CSV大文件并且将其导入数据库示例
思路:
读取csv文件,每读取一行数据,就插入数据库
示例
文件夹结构
/file.csv//csv大文件,这里只模拟三行数据,不考虑运行效率(PS:csv文件格式很简单,文件一般较小,解析很快,运行效率的瓶颈主要在写入数据库操作)index.php//php文件
file.csv
singi,20lily,19daming,23
index.php
/***读取csv文件,每读取一行数据,就插入数据库*///获取数据库实例$dsn='mysql:dbname=test;host=127.0.0.1';$user='root';$password='';try{$db=newPDO($dsn,$user,$password);}catch(PDOException$e){echo'Connectionfailed:'.$e->getMessage();}//读取file.csv文件if(($handle=fopen("file.csv","r"))!==FALSE){while(($row=fgetcsv($handle,1000,","))!==FALSE){//写入数据库$sth=$db->prepare('insertintotestsetname=:name,age=:age');$sth->bindParam(':name',$row[0],PDO::PARAM_STR,255);$sth->bindParam(':age',$row[1],PDO::PARAM_INT);$sth->execute();}fclose($handle);}
数据表
CREATETABLE`test`(`id`INT(10)UNSIGNEDNOTNULLAUTO_INCREMENT,`name`VARCHAR(255)NULLDEFAULT''COLLATE'utf8mb4_bin',`age`INT(10)NULLDEFAULT'0',PRIMARYKEY(`id`))COLLATE='utf8mb4_bin'ENGINE=InnoDB;
运行结束后,数据库中会插入csv中的三行数据
㈨ PHP file_get_contents()读入文件问题
因为explode得到数组key是0、1、2、3,因此无法使用array_key_exists来检查是否存在行,应该使用array_search来检测行的位置,另外读入再拆分可以直接使用file,建议代码为:$arr=file('str.txt');if (array_search('刘二',$arr)===FALSE) echo '没有刘二';注意,array_search结果是找到的key,因此可能为0,没有找到返回的是FALSE,判断的时候要使用三个等号此外,上面的思路只使用大文件中进行少量的搜索,如果是需要反复许多次这样搜索数组,效率更好的办法是使用array_flip把数组的键和值兑换,随后的搜索效率更高。$arr=array('陈一','刘二','李四','张三');print_r($arr);//0=>'陈一',1=>'刘二',2=>'李四',3=>'张三'$arr2=array_flip($arr);print_r($arr2);//'陈一'=>0,'刘二'=>1,'李四'=>2,'张三'=>3
㈩ php 读取大文件倒数第N行的内容
file() 读取每一行到数组,然后根据所以.但这个全读取了;不可能不读取整个文件.
未经允许不得转载:山九号 » php读取大文件内容|php读取txt文件的内容是txt文件太大了怎么办