Apache,Nginx Lighttpd分別使用X-sendfile功能提升檔案下載效能
關於mod_xsendfile
Lighttpd中的X-sendfile
使用X-sendfile方式,伺服器端應用程式不需要讀取下載檔案了,只需要設定response的header資訊就足夠了,此外還要附加一個資訊“X-LIGHTTPD-send-file”資訊給lighttpd,告訴lighttpd,檔案下載就不管了
Apache中的X-sendfile
不經過PHP這層, 直接讓Webserver直接把檔案傳送,使用Apache的module mod_xsendfile, 讓Apache直接傳送這個檔案給使用者給使用者
<?php $file = "/tmp/中文名.tar.gz";$filename = basename($file);header("Content-type: application/octet-stream" );//處理中文檔名 $ua = $_SERVER["HTTP_USER_AGENT"]; $encoded_filename = urlencode($filename); $encoded_filename = str_replace("+", "%20", $encoded_filename); if (preg_match("/MSIE/", $ua)) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); } else if (preg_match("/Firefox/" , $ua)) { header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"'); } else { header('Content-Disposition: attachment; filename="' . $filename . '"'); } header('Content-Disposition: attachment; filename="' . basename($file) . '"'); //讓Xsendfile傳送檔案 header("X-Sendfile: $file" );
Nginx中的X-Accel-Redirect
傳送靜態檔案使用的是一個叫做X-sendfile的header特性.
nginx當然也有這個特性,但是實現的略微不同,在nginx中叫做X-Accel-Redirect.
有兩個特性需要闡述:
1.header 中必須包括URI
2.本地必須宣告為 internal,用於內部redirect和X-Accel-Redirect responses。
配置例子:
程式碼
location /public/ {
internal;
root /專案目錄;
}
應用程式介面:
程式碼
x_accel_redirect "/專案目錄/public", :filename => "iso.img"
這樣,nginx將傳送/專案目錄/public/iso.img 檔案。
其他例子:
引用
x_accel_redirect(‘/path/to/image.jpg’, :type => ‘image/jpeg’, :disposition=>’inline’)
header還支援如下屬性:
程式碼
X-Accel-Limit-Rate: 1024
X-Accel-Buffering: yes|no
X-Accel-Charset: utf-8