首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Apache mod_xsendfile 讓 PHP 提供高效能檔案下載

     編輯:PHP 綜合知識

直接用 PHP readfile 輸出大檔案會佔用記憶體與進程。mod_xsendfile 讓 Apache 直接傳送檔案,PHP 僅負責權限檢查與統計。

基本 PHP 下載(不推薦大檔)

<?php
$file = 'test.zip';
if(file_exists($file)){
    header('content-type:application/octet-stream');
    header('content-disposition:attachment; filename='.basename($file));
    header('content-length:'.filesize($file));
    readfile($file);
}
?>

中文檔名處理

$filename = '中文.zip';
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$encode_filename = rawurlencode($filename);
if(preg_match("/MSIE/",$user_agent)){
    header('content-disposition:attachment; filename="'.$encode_filename.'"');
}elseif(preg_match("/Firefox/",$user_agent)){
    header("content-disposition:attachment; filename*=\"utf8''".$filename.'"');
}else{
    header('content-disposition:attachment; filename="'.$filename.'"');
}
readfile($file);

mod_xsendfile 作法

  1. 安裝模組:yum install mod_xsendfile 或編譯安裝。
  2. Apache 設定:XSendFile on、XSendFilePath /var/www/files。
  3. PHP 只需輸出 X-Sendfile 標頭:
<?php
$file = '/var/www/files/secret.zip';
if(file_exists($file)){
    header('X-Sendfile: '.$file);
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    // 結束腳本,Apache 接管傳輸
    exit;
}
?>

優點

  • PHP 進程立即釋放,支援超大檔、斷點續傳、並發高。
  • 可搭配權限檢查、下載統計、防盜鏈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved