今天因為乙個老同學找我,說自己公司的物流業務都是現在用excel處理,按月因為資料量大,乙個excel差不多有百萬資料,檔案有接近100m,開啟和搜尋就相當的慢聯想到場景:要匯入資料,可能excel資料量很大,這裡利用常用的一些方法比如phpexcel會常有時間和記憶體限制問題
下面我們就利用乙個利用流處理的類庫spreadsheetreader來做大excel的讀取
關鍵具體在**裡注釋
<?php
/** * created by phpstorm.
* user: qkl
* date: 2018/7/11
* time: 15:14
*/set_time_limit(0); // 設定指令碼最大執行時間 為0 永不過期
//ini_set('memory_limit','200m'); // 臨時設定最大記憶體占用
function convert($size)
require '../vendor/autoload.php';
$start = memory_get_usage();
echo convert($start) . php_eol;
//$inputfilename = './11111111.xlsx';
$inputfilename = './example1.xlsx';
// if you need to parse xls files, include php-excel-reader
$starttime = microtime(true);
$reader = new spreadsheetreader($inputfilename);
//獲取當前檔案所有的工作表
$sheets = $reader->sheets();
if (!$sheets)
//改變當前處理的工作表
$reader->changesheet(0);
//列印當前所在工作表的當前所在行資料
var_dump($reader->current());
//因為reader類整合了iter所以可以用迭代方式處理
//這裡提醒 如果檔案超大,這邊的處理速度會過慢,不過不會引發記憶體效能問題
//$i = 0;
//foreach ($reader as $row)
////
// echo $i . php_eol;
// print_r($row);
//// $i++;
//}$endtime = microtime(true);
$memoryuse = memory_get_usage();
echo "記憶體占用:" . convert($memoryuse) . "; 用時:" . ($endtime - $starttime) . php_eol;
上面讀取的example1.xlsx檔案有100m左右,讀寫過慢,測試只開了讀取當前預設工作表的當前所在行資料因資料敏感,已做遮蔽
147.77 kb
array (size=50)
0 => string '************xx' (length=25)
1 => string '************xx' (length=15)
2 => string '************xx' (length=18)
3 => string '************xx' (length=12)
4 => string '************xx' (length=12)
5 => string '************xx' (length=12)
6 => string '************xx' (length=24)
7 => string '************xx' (length=12)
8 => string '************xx' (length=27)
9 => string '************xx' (length=12)
10 => string '************xx' (length=15)
11 => string '************xx' (length=28)
12 => string '************xx' (length=9)
13 => string '************xx' (length=12)
14 => string '************xx' (length=9)
15 => string '************xx' (length=6)
16 => string '************xx' (length=9)
17 => string '************xx' (length=3)
18 => string '************xx' (length=6)
19 => string '************xx' (length=3)
20 => string '************xx' (length=15)
21 => string '************xx' (length=15)
22 => string '************xx' (length=19)
23 => string '************xx' (length=13)
24 => string '************xx' (length=19)
25 => string '************xx' (length=12)
26 => string '************xx' (length=12)
27 => string '************xx' (length=12)
28 => string '************xx' (length=6)
29 => string '************xx' (length=12)
30 => string '************xx' (length=6)
31 => string '************xx' (length=15)
32 => string '************xx' (length=24)
33 => string '************xx' (length=18)
34 => string '************xx' (length=18)
35 => string '************xx' (length=24)
36 => string '************xx' (length=12)
37 => string '************xx' (length=18)
38 => string '************xx' (length=21)
39 => string '************xx' (length=9)
40 => string '************xx' (length=9)
41 => string '************xx' (length=18)
42 => string '************xx' (length=21)
43 => string '************xx' (length=15)
44 => string '************xx' (length=12)
45 => string '************xx' (length=6)
46 => string '************xx' (length=12)
47 => string '************xx' (length=22)
48 => string '************xx' (length=22)
49 => string '' (length=0)
記憶體占用:207.55 kb; 用時:9.5835480690002
php 讀取超大檔案
php開發很多時候都要讀取大檔案,比如csv檔案 text檔案等。這些檔案如果很大,比如10個g。這時,直接一次性把所有的內容讀取到記憶體中計算不太現實。遇到這種情況,往往覺得php太弱,實則不然。利用生成器 關鍵字yield 就能解決。好了,上 created by phpstorm.user a...
php讀取超大檔案fseek
function readmaxfile fp start 0 fseek fp,start,seek set res fread fp,1 content res if substr content,strlen tag tag start 1 if feof fp sleep 3 echo 從位...
php實現讀取超大檔案的方法
通常來說在php讀取大檔案的時候,我們採用的方法一般是一行行來講取,而不是一次性把檔案全部寫入記憶體中,這樣會導致php程式卡死,下面就給大家介紹這樣乙個例子。讀取大檔案最後幾行資料 取檔案最後 n行 param string filename 檔案路徑 param int n 最後幾行 retur...