直接用 PHP readfile 輸出大檔案會佔用記憶體與進程。mod_xsendfile 讓 Apache 直接傳送檔案,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);
yum install mod_xsendfile 或編譯安裝。XSendFile on、XSendFilePath /var/www/files。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;
}
?>