2011-05-18 66 views
2

我在這裏有一個問題,也許有人已經通過這之前。php的輸出是有限的

系統控制器服務於php下載,它從文件中讀取信息併發送客戶端作爲下載。該系統完美運作。問題是速度總是很低,總是低於用戶的100kb/s以下的300kb/se次。

服務器有一個100mbps的鏈接6mbps免費和客戶有,那麼它應該下載在600kb/s。東西是持有的輸出的PHP。我試過尋找Apache的緩衝區,但在這個問題上沒有發現任何東西。

有沒有人有任何想法可能會發生什麼?

+0

沒有一個編程問題聽起來更像serverfault給我... – soandos 2011-05-18 04:21:06

+0

你不能通過任何一端的速度來判斷下載速度。它受路徑中最慢的路由器影響。另外,對於ISP,您可能會獲得高速ADSL,但其上行鏈路可能會被太多用戶堵塞。無論如何,這不是一個編程問題。 – Rasika 2011-05-18 04:24:22

回答

6

PHP確實不是爲處理大文件而構建的。它必須將整個文件讀入內存然後輸出。這聽起來像是你通過PHP發送合理數量的流量,如果每個用戶100kb/s - 300kb/s太慢,通過類似readfile()這是一個壞主意。相反,我建議看一下mod_xsendfile(如果你使用的是Apache)或者它對於你選擇的Web服務器是相同的(例如我更喜歡nginx,並且爲此使用XSendFile)。

在PHP中,你可以這樣做:header('X-Sendfile: ' . $file);。服務器攔截標題併發送該文件。它允許你使用PHP進行的操作,以及Web服務器直接讀取文件的速度。

+0

也不是,因爲php必須規定發送給客戶端的數量和哪些字節,因爲當它發送到客戶端時,他正從另一個服務器下載。 php的輸出並不慢,所以他可以在很短的時間內保存這些600mb的磁盤。數據被傳送給被禁止的客戶端。 如果該文件已被下載到磁盤,這將只有mod_sendfile。如果你不知道如何保護文件,或者這只是一個重定向。另外,不會處理到客戶端的MIME類型和文件名,因爲Apache會忽略其他所有內容。 – user758499 2011-05-18 15:40:53