在使用PHP編寫(xiě)程序的過(guò)程中,很多時(shí)候需要從文件中讀取內(nèi)容。PHP提供了豐富的文件處理函數(shù),其中一個(gè)常用的函數(shù)便是readfile()。這個(gè)函數(shù)可以直接讀取文件并輸出到瀏覽器端,省去了使用fread()等函數(shù)的多個(gè)步驟,極大地簡(jiǎn)化了代碼。但在讀取大文件時(shí),使用readfile()函數(shù)可能會(huì)受到速度限制。
以一個(gè)500M的大文件為例,使用readfile()函數(shù)進(jìn)行讀取,并同時(shí)記錄時(shí)間,代碼如下:
$start = microtime(true); readfile('largefile.txt'); $end = microtime(true); echo 'Time used:'.($end-$start).'s';
代碼運(yùn)行后,輸出的時(shí)間從3秒到5秒不等,這個(gè)時(shí)間并不算快。讀取方式一般有兩種,分別是讀取文件后進(jìn)行輸出,以及直接輸出文件內(nèi)容。下面讓我們來(lái)看看這兩種方式的效率。
方式一:直接讀取文件并輸出
$file = fopen('largefile.txt', 'rb'); while(!feof($file)) { echo fread($file, 4096); } fclose($file);
代碼中使用fopen()函數(shù)打開(kāi)文件,然后通過(guò)while循環(huán)讀取文件內(nèi)容并輸出,最后通過(guò)fclose()函數(shù)關(guān)閉文件。經(jīng)測(cè)試,此方法的速度略快于readfile()方法,耗時(shí)2秒左右。
方式二:輸出文件內(nèi)容
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=largefile.txt'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize('largefile.txt')); header('Cache-Control: private, max-age=5, must-revalidate'); header('Pragma: public'); ob_clean(); flush(); readfile('largefile.txt'); exit;
這個(gè)方法的優(yōu)化點(diǎn)在于設(shè)置多個(gè)header頭部,其中也包括Content-Length,這個(gè)設(shè)置會(huì)告訴瀏覽器整個(gè)文件的大小。經(jīng)測(cè)試,在文件較大時(shí),與其他兩種方法相比遺留前兩種方法,耗時(shí)約1秒。
總的來(lái)說(shuō),對(duì)于小文件而言,readfile()函數(shù)還是比較快捷的。但是,在讀取大文件時(shí),我們需要對(duì)代碼進(jìn)行優(yōu)化,選擇適合的方法以提高速度。當(dāng)然,還有許多其他的優(yōu)化小技巧,需要大家一起探索。