2010-06-09 81 views
2

所以我有一堆文件,有些可以高達30-40mb 和我想用PHP來處理文件的安全性,所以我可以控制誰有權訪問他們php大多數內存有效的方式來返回文件

這意味着我有一個劇本有點像這個粗略的例子

$has_permission = check_database_for_permission($user, filename); 

if ($has_permission) { 
    header('Content-Type: image/jpeg'); 
    readfile ($filename);  
    exit; 
} else { 
    // return 401 error 
} 

我會恨的每個請求加載完整的文件到內存中,因爲它很快就會嚼了所有的記憶我的服務器上一些同時請求

所以一對q問題

  1. readfile是最有效的內存方式嗎?
  2. 是否有一些更好的方法來實現相同的結果,我忽略了?

服務器:Apache/PHP5

感謝

回答

6

readfile是這樣做的正確方法。通過一切手段不要嘗試自己讀取文件並將其打印輸出 - 消耗過多的內存。通過readfile函數,文件的內容被直接緩衝到輸出,佔用了一個微不足道的暫時內存。

+0

+1刪除我的答案,當你看着很明顯。 – 2010-06-09 21:59:37

+0

我在Pekka的回答中輸入了這條評論,它被刪除了:「readfile()這樣做,直接從文件中將文件複製到網絡服務器的內存中。循環將數據從文件複製到PHP內存中,然後從PHP內存到網絡服務器 隨着readfile()系統可以選擇一個最好的塊大小,它可能不是8192「 – johannes 2010-06-09 22:03:26

+0

只要記住,在整個過程中,一個用戶正在下載一個文件,一個PHP進程將被阻止。因此,如果您的服務器上運行了8個PHP進程並且有8個用戶正在下載文件,您的網站將無法處理任何涉及PHP的更多請求,這通常意味着網站將完全凍結。 – 0scar 2010-06-09 23:10:26

3

最快的方法是當您可以將此中繼到網絡服務器。 Web服務器可以使用sendfile()調用來要求操作系統內核直接從文件複製到網絡流。 例如利用lighttpd的時候有一種方式,PHP可以用信號通知服務器接管並做了sendfile招:

http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file

+0

不幸的是,我需要軟件在多臺服務器上運行,並且我無法保證所有模塊都可用。但絕對是我會看的,謝謝 – bumperbox 2010-06-09 22:34:34

相關問題