2009-06-16 117 views
3

由於各種原因,我需要在HTTP請求和磁盤上的文件之間起中介作用。我的方法是填充標題,然後執行一個讀取文件('/ path/to/file.jpg');PHP passthrough slow

現在,一切工作正常,但它甚至返回一箇中等大小的圖像非常緩慢。

任何人都可以提供給我一個更有效的方式,一旦頭文件被髮送後,將文件傳輸到客戶端?

注:這是一個共享的主機環境中的Linux操作系統中,如果它的事項

+0

如果包含您正在使用的操作系統,會不錯。 – 2009-06-16 15:18:54

回答

3

幾個Web服務器允許外部腳本告訴他們這樣做。 Apache(與mod_xsendfile)上的X-Sendfile是一個。

簡而言之,您發送的只是標題。特殊的標題指示Web服務器發送指定的文件作爲響應的主體。

+0

當,我在一個共享主機環境,它似乎並不支持這個模塊。 – 2009-06-16 15:39:42

0

你可以與實施有條件的GET請求支持啓動。

每當客戶端用「If-Modified-Since」請求文件並發現該文件未被修改時,發送帶有該文件的「Last-Modified」標頭並回復「304 Not Modified」。一些明智的新鮮度信息(通過「緩存控制」/「過期」標題)也是可取的,以防止首先對未改變的資源的重複請求。

即使您發現自己對實際表現無能爲力,這種方式至少可以提高感知的表現。

+0

已經完成。雖然沒有解決問題,因爲在第一次加載時,它仍然非常緩慢。 – 2009-06-16 15:23:43

+0

我明白了。好的,我會讓答案坐在這裏爲通過谷歌抵達的人。 – Tomalak 2009-06-16 15:31:24

-2

基本上你想建立一個服務器......這不是微不足道的。

有一個基於PHP的服務器的非常promissing項目:Nanoweb

它是免費的,並且完全可擴展。

0

這實際上應該相當快。我們用大圖像完成了這個沒有問題。在輸出圖像之前,你還在做其他任何事情嗎?例如計算圖像上的一些元數據?

編輯: 您可能需要刷新輸出並使用fread。 IE:

$fp = fopen($strFile, "rb"); 
//start buffered download 
while(!feof($fp)) 
    { 
    print(fread($fp,1024*16)); 
    flush(); 
    ob_flush(); 
    } 
fclose($fp);