由於各種原因,我需要在HTTP請求和磁盤上的文件之間起中介作用。我的方法是填充標題,然後執行一個讀取文件('/ path/to/file.jpg');PHP passthrough slow
現在,一切工作正常,但它甚至返回一箇中等大小的圖像非常緩慢。
任何人都可以提供給我一個更有效的方式,一旦頭文件被髮送後,將文件傳輸到客戶端?
注:這是一個共享的主機環境中的Linux操作系統中,如果它的事項
由於各種原因,我需要在HTTP請求和磁盤上的文件之間起中介作用。我的方法是填充標題,然後執行一個讀取文件('/ path/to/file.jpg');PHP passthrough slow
現在,一切工作正常,但它甚至返回一箇中等大小的圖像非常緩慢。
任何人都可以提供給我一個更有效的方式,一旦頭文件被髮送後,將文件傳輸到客戶端?
注:這是一個共享的主機環境中的Linux操作系統中,如果它的事項
幾個Web服務器允許外部腳本告訴他們這樣做。 Apache(與mod_xsendfile)上的X-Sendfile是一個。
簡而言之,您發送的只是標題。特殊的標題指示Web服務器發送指定的文件作爲響應的主體。
當,我在一個共享主機環境,它似乎並不支持這個模塊。 – 2009-06-16 15:39:42
你可以與實施有條件的GET請求支持啓動。
每當客戶端用「If-Modified-Since」請求文件並發現該文件未被修改時,發送帶有該文件的「Last-Modified」標頭並回復「304 Not Modified」。一些明智的新鮮度信息(通過「緩存控制」/「過期」標題)也是可取的,以防止首先對未改變的資源的重複請求。
即使您發現自己對實際表現無能爲力,這種方式至少可以提高感知的表現。
已經完成。雖然沒有解決問題,因爲在第一次加載時,它仍然非常緩慢。 – 2009-06-16 15:23:43
我明白了。好的,我會讓答案坐在這裏爲通過谷歌抵達的人。 – Tomalak 2009-06-16 15:31:24
這實際上應該相當快。我們用大圖像完成了這個沒有問題。在輸出圖像之前,你還在做其他任何事情嗎?例如計算圖像上的一些元數據?
編輯: 您可能需要刷新輸出並使用fread。 IE:
$fp = fopen($strFile, "rb");
//start buffered download
while(!feof($fp))
{
print(fread($fp,1024*16));
flush();
ob_flush();
}
fclose($fp);
如果包含您正在使用的操作系統,會不錯。 – 2009-06-16 15:18:54