背景
工作中有遇到一些場(chǎng)景牙寞,處理某些文件時(shí)因?yàn)閿?shù)據(jù)量太多太大了而導(dǎo)致處理時(shí)間非常長(zhǎng),并且大概率會(huì)處理失敗。所以參考了網(wǎng)上的一些資料:php 處理拆分文件盏袄,不會(huì)從行中間切斷忿峻。
先看效果
大文件拆分為4個(gè)文件
[root@iZt4nijo6mcpzvyciap0kaZ HongXunPan]# ll -h
total 4.1M
-rw-r--r-- 1 root root 4.1M May 23 17:19 test.txt
[root@iZt4nijo6mcpzvyciap0kaZ HongXunPan]# vim test.php
-rw-r--r-- 1 root root 961 May 23 17:20 test.php
-rw-r--r-- 1 root root 4276536 May 23 17:19 test.txt
[root@iZt4nijo6mcpzvyciap0kaZ HongXunPan]# /usr/local/php/bin/php test.php
[root@iZt4nijo6mcpzvyciap0kaZ HongXunPan]# ll -h
total 8.2M
-rw-r--r-- 1 root root 961 May 23 17:20 test.php
-rw-r--r-- 1 root root 4.1M May 23 17:19 test.txt
-rw-r--r-- 1 root root 1.1M May 23 17:21 test.txt_0
-rw-r--r-- 1 root root 1.1M May 23 17:21 test.txt_1
-rw-r--r-- 1 root root 1.1M May 23 17:21 test.txt_2
-rw-r--r-- 1 root root 1.1M May 23 17:21 test.txt_3
拆分為10個(gè)文件
[root@iZt4nijo6mcpzvyciap0kaZ HongXunPan]# /usr/local/php/bin/php test.php
[root@iZt4nijo6mcpzvyciap0kaZ HongXunPan]# ll -h
total 8.2M
-rw-r--r-- 1 root root 962 May 23 17:29 test.php
-rw-r--r-- 1 root root 4.1M May 23 17:28 test.txt
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_0
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_1
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_2
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_3
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_4
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_5
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_6
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_7
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_8
-rw-r--r-- 1 root root 418K May 25 19:45 test.txt_9
源碼
test.php
<?php
$filename = './test.txt';
$file = fopen($filename,'r+') or die('fail');
$filenum = 4; //拆分成新文件的數(shù)量
$filelen = ceil(filesize($filename)/$filenum); //每個(gè)新文件的長(zhǎng)度
rewind($file); //指針設(shè)置到文件開(kāi)頭0的位置
$lastlen = 0;
for ($i = 0; $i< $filenum ; $i++)
{
$content = fread($file, $filelen + $lastlen); //等長(zhǎng)字符串,加上上一個(gè)字符串不足一行的部分
$lastn = strrchr($content, "\n"); //不足一行的字符串
$lastlen = strlen($lastn); //不足一行的字符串長(zhǎng)度
$complete = substr($content, 0, strlen($content) - $lastlen); //減去當(dāng)前字符串不足一行的部分,得到每一行都完整的字符串
//寫入新文件
$newfile = fopen($filename. '_' . $i, 'w+');
fwrite($newfile, $complete);
fseek($file, ftell($file) - $lastlen + 1); //將文件指針?lè)祷氐讲蛔阋恍械拈_(kāi)頭辕羽,使下一個(gè)文件能得到完整行
}
fclose($file);