亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP中輸出文件,怎么區別什么時候該用readfile() , fread(), file_get_contents(), fgets()?

PHP中輸出文件,怎么區別什么時候該用readfile() , fread(), file_get_contents(), fgets()?

慕工程0101907 2019-04-13 08:45:50
我在服務器端(Apache環境)上放了一個安卓apk安裝包的下載鏈接,使用readfile()讀取apk文件輸出下載后,手機安裝apk顯示解析包錯誤。但apk本身沒問題,下載后文件的大小也是完整的。服務器mime也設置了。后來換用fread()后輸出就好了。不明白是為什么。搜索了一下沒遇到解釋的很清楚的,有說是因為「對二進制友好」,有這么一說嗎?包括還有file_get_contents(),fgets()等另外的幾個文件讀取函數和方法,一直都不能很好的分清什么時候該用哪個。除了手冊之外,有沒有一些有應用場景的好的介紹文章?補上前后的代碼:readfile():header("Content-type:application/vnd.android.package-archive");header("Accept-Ranges:bytes");header("Accept-Length:".$filesize);header("Content-Disposition:attachment;filename=".$name);readfile($file);fread():header("Content-type:application/vnd.android.package-archive");header("Accept-Ranges:bytes");header("Accept-Length:".$filesize);header("Content-Disposition:attachment;filename=".$name);$handle=fopen($file,"r");echofread($handle,$filesize);fclose($handle);
查看完整描述

2 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

如果是直接寫入或讀取全部直接用file_get_contents()file_put_contents()更方便
fread可以讀取指定大小,讀取指定行等等,還能鎖定文件功能比較強
以下是readfile手冊中的解釋:
readfile()函數輸出一個文件。
該函數讀入一個文件并寫入到輸出緩沖。若成功,則返回從文件中讀入的字節數若失敗,則返回false,這個函數會在文檔最后輸出字節數。
                            
查看完整回答
反對 回復 2019-04-13
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

fread()和readfile()fread()最大一次性能讀取8k長度的字節數,所以不能一次性讀取大文件去作下載。優勢在于,操作更加靈活,每次讀取指定字節的內容,用于下載時方便控制服務器的流量。readfile()優勢是能夠一次性讀取大文件;不需要PHP預讀到內存,下載速度更快,直接把文件的處理交由服務器。缺點就是不能控制負載。所以它是沒有內存限制的,如果遇到報內存錯誤,先調用ob_end_flush()之類的函數關閉緩沖區。
file_get_contents也是沒readfile()快,因為也是走了php的內存。但是在讀取小文本內容到字符串變量時,這個函數最適合使用,簡單,更快。
fgets()是一次讀取文件中的一行了,再需要逐行處理文件的時候,使用這個
                            
查看完整回答
反對 回復 2019-04-13
  • 2 回答
  • 0 關注
  • 1115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號