博文記錄
PHP 2019-09-04 15:22:51 233 0

PHP读取大文件源码示例,通过PHP读取过大、超大型文件的思路及解决方案。

在日常读取文件时,若文件 不是很大,通常使用file_get_contents,将内容一次性载入的变量中,也可以远程加载网页或者远端文件。

若加载超过PHP限制的内存大小,或者超过本机内存大小的文件进程就会报错或者崩掉。

为了解决这个问题,我们采用使用完毕并释放的原则来读取大文件。

单线程读入

如果不考虑多线程的情况下,单线程读取大文件采用while fread就可以实现。

如下代码

$handle = fopen("./big.txt", "rb");
while (!feof($handle)) {
  $contents = fread($handle, 8192);
  // 业务处理
  unset($contents); // 释放掉变量
}
fclose($handle);

feof是判断是否到文件尾,如果没有到文件尾,则会一直while循环,并执行读取操作。每次读取8192字节,然后使用过后将其释放掉。

 

往往很多文件并不是一行的,有多行内容。需要将每行内容读取出来当做一条数据处理,也可以使用fgets。

即如下代码:

$handle = fopen("./big.txt", "rb");
while (!feof($handle)) {
  $contents = fgets($handle, 1024);
  // 业务处理
  unset($contents); // 释放掉变量
}
fclose($handle);

这里的fgets第二个参数,默认为1024字节。即默认读取一行数据,如果一行数据小于1024字节,则完整读取。如果超出1024字节,则只取前1024字节。遇到换行符"\n"或者"\r\n"或者结束符会停止读取。

如果遇到变态的文件,很多行都只有1000长度,某一行有8000长度,如果在不清楚的情况下,就很难掌控,若要完整读取就需要指定读取的最大字节,8000才能将每一行完整读取。

 

还有一种方法就是自己处理换行符。默认读取1024字节,然后放置到内存中,使用过后再将其释放。这种操作很节省内存,但是在逻辑处理上需要自己处理换行符。

如,读取1024字节,没有换行符,则保存数据继续读取。再读取1024字节,判断其中是否有换行符,如果有则处理最开始到换行符中的数据。再将剩下的数据保存,等待下一次读取,直到整个文件读取完毕。

$handle = fopen("./big.txt", "rb");
$contents = "";
while (!feof($handle)) {
  $contents .= fread($handle, 8192);

  // 判断读取到的内容是否包含换行符,包含则进入循环体
  while(strpos($contents, "\n") !== false){
      $eol_pos= strpos($contents, "\n");
      $line = substr($contents, 0, $eol_pos);
      // $line为一行的数据,进行业务处理,并释放
      unset($line);

      $contents = substr($eol_pos, 0);// 将剩余内容放置到变量中以供下次使用
  }
}
fclose($handle);

 

多线程读取

PHP默认没有多线程,这里可以采用多进程的方式实现,或者swoole的多进程来实现。

例如读取一个8GB文件,分8个线程,每个线程读取1GB数据内容。或者更多线程进行拆分工作内容。

获取文件大小

首先第一步,就是获取整个文件的体积大小,然后计算每个线程应该负责处理的一部分内容。

function length($filename)
{
	$handle = fopen($filename, "rb");
	$currentPos = ftell($handle);
	fseek($handle, 0, SEEK_END);
	$length = ftell($handle);
	fseek($handle, $currentPos);
	// $length 文件总长度
	return $length;
}
echo length("./big.txt");

 

处理逻辑实现过程

这里主要说明下作了哪些内容,首先是设定分配总的线程数。然后根据设置的线程数,计算每个线程要读取的数据大小,即从哪里开始读,读到哪里结束。

然后必定会出现拆分后,读到不完整行的情况,在这里来解决这种前半行或者后半行的意外情况。

解决逻辑就是,假设线程开始的读取位置在某一行的中间,我们一个字符向前移动,移动到上个换行符(也可能是最开始)即可获取到整行文本内容。

处理掉残行数据之后,使用yield来传递数据给业务处理。

$filename = "./big.txt";
$maxProcess = 8;// 分配8个线程


$length = length($filename);
$singleProcessLength = ceil($length / $maxProcess);

// 线程负责读取的内容
function processRead($filename, $index, $singleProcessLength)
{
	$fh = fopen($filename, 'r');
	
	$beginPos = $index * $singleProcessLength;
	//结束位置=线程序列*线程处理数据长度+线程处理数据 - 1 (长度转指针,实际结束指针小于结束长度)
	$endPos = $index * $singleProcessLength + $singleProcessLength - 1;

	fseek($fh, $beginPos);
	echo '线程:' . $index . ',起始位置:' . $beginPos . ',结束位置:' . $endPos . PHP_EOL;
	//移动到上个\n 以便首次顺利获取整行内容
	while (fseek($fh, -1, SEEK_CUR) === 0) {
		if (fread($fh, 1) == "\n" || ftell($fh) <= 0) {
			break;
		}
		fseek($fh, -1, SEEK_CUR);
	}
	echo '线程:' . $index . ',移动完毕!!!!!' . PHP_EOL;

	//整行读取数据
	//结束时位置超过预计结束位置是正常状况,fgets 读取一整行内容
	//预计结束位置可能在行内,所以产生不同结果。
	while (ftell($fh) <= $endPos && !feof($fh)) {
		yield $raw = fgets($fh);
	}
	echo '进程' . $index . '结束时 指针位置:' . ftell($fh) . ', 应该到:' . $endPos . PHP_EOL;
	fclose($fh);
}

foreach(range(0,$maxProcess - 1) as $index){
	// 多线程采用多线程的方式创建,这里采用yield回调。
	foreach(processRead($filename, $index, $singleProcessLength) as $value){
        // $value为每一行的内容,处理后释放
        unset($value);
    } 
}

 

如上所述就是PHP的大文件读取解决方案,大部分用于多线程读取大文件场景。

sozukiosir

2019-10-02 00:04

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> wuq.hrxo.eller.tech.lqr.tn http://mewkid.net/buy-xalanta/

oxdezipotabi

2019-10-02 00:13

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Online</a> jfz.lmao.eller.tech.atr.dw http://mewkid.net/buy-xalanta/

haefumofieb

2019-10-02 04:36

http://mewkid.net/buy-xalanta/ - Buy Amoxil Online <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin Online</a> ilc.ueuh.eller.tech.ath.em http://mewkid.net/buy-xalanta/

ugozumozvoga

2019-10-02 04:45

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Online</a> dyt.rqms.eller.tech.alm.kc http://mewkid.net/buy-xalanta/

uevzoxep

2019-10-02 09:12

http://mewkid.net/buy-xalanta/ - Amoxicillin 500 Mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> gfm.fatn.eller.tech.obm.hq http://mewkid.net/buy-xalanta/

erelizezula

2019-10-02 09:38

http://mewkid.net/buy-xalanta/ - Amoxicillin Without Prescription <a href="http://mewkid.net/buy-xalanta/">Amoxil Dose For 55 Pounds</a> uop.qsts.eller.tech.svm.rh http://mewkid.net/buy-xalanta/

agfifawloconu

2019-10-02 12:43

http://mewkid.net/buy-xalanta/ - Amoxicillin Without Prescription <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> keq.wlrb.eller.tech.jha.qp http://mewkid.net/buy-xalanta/

oluqeti

2019-10-02 12:49

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin</a> mnj.huax.eller.tech.iwu.wk http://mewkid.net/buy-xalanta/

ejogaygabem

2019-10-02 16:37

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Without Prescription</a> dmw.vkzf.eller.tech.wkl.zs http://mewkid.net/buy-xalanta/

efdigeda

2019-10-02 17:02

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> aij.igxv.eller.tech.ckr.go http://mewkid.net/buy-xalanta/

ajapiqiovefxu

2019-10-02 20:20

http://mewkid.net/buy-xalanta/ - Buy Amoxil Online <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Online</a> rbp.qizk.eller.tech.wcx.tj http://mewkid.net/buy-xalanta/

izonicopehi

2019-10-02 20:29

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxil</a> gfg.hxzr.eller.tech.eed.lu http://mewkid.net/buy-xalanta/

pitgupexiv

2019-10-03 00:50

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Amoxil</a> acq.jssq.eller.tech.uoy.uk http://mewkid.net/buy-xalanta/

nojecaki

2019-10-03 00:58

http://mewkid.net/buy-xalanta/ - Buy Amoxil <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin</a> nnv.hnfk.eller.tech.evi.hj http://mewkid.net/buy-xalanta/

ekewyew

2019-10-03 05:01

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Online</a> uwf.elze.eller.tech.fdq.qt http://mewkid.net/buy-xalanta/

abakuwa

2019-10-03 05:18

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> zhz.zbks.eller.tech.oit.ml http://mewkid.net/buy-xalanta/

aoxarepuz

2019-10-03 08:02

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> jia.wdha.eller.tech.kzu.iv http://mewkid.net/buy-xalanta/

eakivisev

2019-10-03 08:10

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Buy Amoxil Online</a> bpg.qtpg.eller.tech.vtb.zs http://mewkid.net/buy-xalanta/

ibyragiz

2019-10-03 11:01

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> sbv.ldrr.eller.tech.eyt.vm http://mewkid.net/buy-xalanta/

vayabivecoko

2019-10-03 11:08

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500 Mg</a> rvl.uviv.eller.tech.uwt.to http://mewkid.net/buy-xalanta/

uqujudtu

2019-10-03 13:55

http://mewkid.net/buy-xalanta/ - Amoxil <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> mlv.rfoh.eller.tech.lkm.mi http://mewkid.net/buy-xalanta/

aceteroafo

2019-10-03 14:11

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg</a> sgk.xngn.eller.tech.aus.xw http://mewkid.net/buy-xalanta/

ehowbano

2019-10-03 16:57

http://mewkid.net/buy-xalanta/ - Amoxicillin 500 Mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> nhg.texk.eller.tech.cuf.fy http://mewkid.net/buy-xalanta/

uzaiqiaogehit

2019-10-03 17:25

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> lse.hljj.eller.tech.elx.wt http://mewkid.net/buy-xalanta/

orebarogama

2019-10-03 19:42

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Online</a> mvy.oqhf.eller.tech.eqt.xr http://mewkid.net/buy-xalanta/

lejebaxi

2019-10-03 19:49

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> jhc.ufhb.eller.tech.liw.sv http://mewkid.net/buy-xalanta/

acotqayevoc

2019-10-04 02:09

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin Online</a> igi.wrzw.eller.tech.drk.qh http://mewkid.net/buy-xalanta/

avwedfu

2019-10-04 02:10

http://mewkid.net/buy-xalanta/ - Amoxicillin 500 Mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> dnk.fksl.eller.tech.dvu.ks http://mewkid.net/buy-xalanta/

alawoyetidul

2019-10-04 02:15

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> jtr.rard.eller.tech.aou.oy http://mewkid.net/buy-xalanta/

ekelayeh

2019-10-04 02:20

http://mewkid.net/buy-xalanta/ - Amoxicillin On Line <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Online</a> jga.amct.eller.tech.jym.pw http://mewkid.net/buy-xalanta/

efavixixiha

2019-10-04 05:18

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin Online</a> jfy.ndxb.eller.tech.bnp.fo http://mewkid.net/buy-xalanta/

ujulonalfo

2019-10-04 05:26

http://mewkid.net/buy-xalanta/ - Buy Amoxil <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> dck.vbqx.eller.tech.eza.gi http://mewkid.net/buy-xalanta/

aotafijuvoti

2019-10-04 08:36

http://mewkid.net/buy-xalanta/ - Amoxil Causes Gallstones <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> lgi.gezf.eller.tech.jya.kq http://mewkid.net/buy-xalanta/

afeyoiemuxube

2019-10-04 09:03

http://mewkid.net/buy-xalanta/ - Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin</a> hao.mtrw.eller.tech.vpg.sr http://mewkid.net/buy-xalanta/

bezonefix

2019-10-04 11:28

http://mewkid.net/buy-xalanta/ - Amoxicillin On Line <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> khj.sija.eller.tech.xsh.zh http://mewkid.net/buy-xalanta/

avotiireg

2019-10-04 11:34

http://mewkid.net/buy-xalanta/ - Amoxil Causes Gallstones <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> cvs.jgme.eller.tech.oss.ns http://mewkid.net/buy-xalanta/

uciilohixa

2019-10-04 14:32

http://mewkid.net/buy-xalanta/ - Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxil</a> bhw.cnkl.eller.tech.xyf.uu http://mewkid.net/buy-xalanta/

evsaqodoqacu

2019-10-04 14:39

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxil Causes Gallstones</a> ezv.yumm.eller.tech.iug.jq http://mewkid.net/buy-xalanta/

erunomiryd

2019-10-04 17:34

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500 Mg</a> lew.eozi.eller.tech.dha.xb http://mewkid.net/buy-xalanta/

uxpihaf

2019-10-04 17:42

http://mewkid.net/buy-xalanta/ - Amoxil <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> ttz.hmso.eller.tech.ohf.il http://mewkid.net/buy-xalanta/

iazoore

2019-10-04 20:39

http://mewkid.net/buy-xalanta/ - Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> zaz.lbrf.eller.tech.gxz.yg http://mewkid.net/buy-xalanta/

imukuvies

2019-10-04 20:47

http://mewkid.net/buy-xalanta/ - Amoxicillin 500 Mg <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin</a> otp.bpfh.eller.tech.xoh.pf http://mewkid.net/buy-xalanta/

ixomehukurute

2019-10-04 23:55

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin No Prescription</a> kmz.roqa.eller.tech.jvz.mp http://mewkid.net/buy-xalanta/

egoxaqokule

2019-10-05 00:04

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin</a> ixw.xvpc.eller.tech.lvd.vk http://mewkid.net/buy-xalanta/

awuniwekyobe

2019-10-05 03:06

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Without Prescription</a> ban.kqnc.eller.tech.ojq.qg http://mewkid.net/buy-xalanta/

ekicebe

2019-10-05 03:13

http://mewkid.net/buy-xalanta/ - 18 <a href="http://mewkid.net/buy-xalanta/">Buy Amoxil</a> irg.nvbf.eller.tech.stl.sg http://mewkid.net/buy-xalanta/

ihokoguppazi

2019-10-05 06:10

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Dosage <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Without Prescription</a> ghm.bdql.eller.tech.xav.yx http://mewkid.net/buy-xalanta/

yidouqav

2019-10-05 06:17

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> tfn.puld.eller.tech.gpi.ml http://mewkid.net/buy-xalanta/

aduxpisusaj

2019-10-05 09:23

http://mewkid.net/buy-xalanta/ - Amoxicillin Without Prescription <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Without Prescription</a> vdu.bjqc.eller.tech.axy.do http://mewkid.net/buy-xalanta/

ixudehove

2019-10-05 09:30

http://mewkid.net/buy-xalanta/ - Buy Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Dosage For Amoxicillin 500mg</a> kbf.osjy.eller.tech.pbg.yi http://mewkid.net/buy-xalanta/

ulireqayana

2019-10-05 12:20

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Without Prescription</a> htw.zvix.eller.tech.wup.qu http://mewkid.net/buy-xalanta/

uunyaewaqo

2019-10-05 12:27

http://mewkid.net/buy-xalanta/ - Amoxicillin 500mg Dosage <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin Online Without Prescription</a> nek.hxkq.eller.tech.nsl.rt http://mewkid.net/buy-xalanta/

ohageuaudoyob

2019-10-05 15:16

http://mewkid.net/buy-xalanta/ - Amoxicillin 500 Mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Dosage</a> aid.xpot.eller.tech.rif.rw http://mewkid.net/buy-xalanta/

ixoskegul

2019-10-05 15:43

http://mewkid.net/buy-xalanta/ - Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Buy Amoxicillin Online</a> jfa.mujm.eller.tech.ebz.rp http://mewkid.net/buy-xalanta/

ahuuacokoyudi

2019-10-05 18:07

http://mewkid.net/buy-xalanta/ - Dosage For Amoxicillin 500mg <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg</a> uni.ajrx.eller.tech.fcj.ov http://mewkid.net/buy-xalanta/

tafbike

2019-10-05 18:34

http://mewkid.net/buy-xalanta/ - Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> wnu.ycyk.eller.tech.qys.wx http://mewkid.net/buy-xalanta/

aqazugasu

2019-10-05 21:25

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxil Dose For 55 Pounds</a> okh.dggz.eller.tech.rot.tn http://mewkid.net/buy-xalanta/

ihawumei

2019-10-05 21:50

http://mewkid.net/buy-xalanta/ - Amoxicillin Without Prescription <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg Capsules</a> fnk.mnfu.eller.tech.wmy.bd http://mewkid.net/buy-xalanta/

uhjotah

2019-10-06 03:30

http://mewkid.net/buy-xalanta/ - Amoxicillin <a href="http://mewkid.net/buy-xalanta/">Amoxicillin</a> ssq.ustu.eller.tech.kra.xf http://mewkid.net/buy-xalanta/

uzaciciqado

2019-10-06 03:37

http://mewkid.net/buy-xalanta/ - Amoxicillin No Prescription <a href="http://mewkid.net/buy-xalanta/">Amoxicillin 500mg</a> jmf.ijht.eller.tech.yxh.io http://mewkid.net/buy-xalanta/

mhoecayoq

2019-10-06 07:49

http://mewkid.net/buy-xalanta/ - Amoxicillin Online <a href="http://mewkid.net/buy-xalanta/">18</a> oli.usfg.eller.tech.qts.vq http://mewkid.net/buy-xalanta/

ixecoaayye

2019-10-06 07:57

http://mewkid.net/buy-xalanta/ - Amoxil <a href="http://mewkid.net/buy-xalanta/">Amoxicillin Without Prescription</a> qnq.dsht.eller.tech.dgn.sh http://mewkid.net/buy-xalanta/

發表評論
StudioEIM - 冒险者讲习所
0:00