apache mod_xsendfile 让php提供更快的文件下载

服务器提供一个文件下载,一般使用一个url指向服务器中的文件即可提供下载。

但这样就不能进行统计,权限检测等操作。

因此,一般使用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);
}
?>
处理中文文件名:
<?php
$file = 'test.zip';
$filename = '中文.zip';

if(file_exists($file)){
	$user_agent = $_SERVER['Http_User_agent'];
	$encode_filename = rawurlencode($filename);

	if(preg_match("/MSIE/", $user_agent)){
		header('content-disposition:attachment; filename="'.$encode_filename.'"');
	}else if(preg_match("/Firefox/", $user_agent)){
		header("content-disposition:attachment; filename*=\"utf8''".$filename.'"');
	}else{
		header('content-disposition:attachment; filename="'.$filename.'"');
	}
	readfile($file);
}
?>
使用php readfile,需要经过php这层,如果可以直接通过apache将文件发送给用户,不经过php这层,将会提高下载速度。

使用apache mod_xsendfile,下载地址:mod_xsendfile,让apache直接将文件发给用户

安装:

sudo apxs2 -cia mod_xsendfile.c
sudo a2enmod xsendfile
sudo /etc/init.d/apache2 restart
apxs2 用于编译apache module,需要安装apache2-dev

设置xsendfile打开:
<Directory>
XSendFile On
</Directory>
代码如下:
<?php
$file = 'test.zip';
$filename = '中文.zip';

if(file_exists($file)){
	$user_agent = $_SERVER['Http_User_agent'];
	$encode_filename = rawurlencode($filename);

	if(preg_match("/MSIE/", $user_agent)){
		header('content-disposition:attachment; filename="'.$encode_filename.'"');
	}else if(preg_match("/Firefox/", $user_agent)){
		header("content-disposition:attachment; filename*=\"utf8''".$filename.'"');
	}else{
		header('content-disposition:attachment; filename="'.$filename.'"');
	}
	header('X-Sendfile:'.$file);
}
?>

posted @ 2013-10-22 00:56  傲雪星枫  阅读(314)  评论(0编辑  收藏  举报