2016-04-30 110 views
2

我需要使用PHP和身份验证从我的网络服务器提供非常大的文件(1Gb +),以便只有某些客户才有权下载文件。使用linux上的mod_xsendfile使用PHP下载大文件

由于内存和超时限制,我不想使用直接链接并使用PHP脚本来提供文件不是一个选项。

我的web服务器与Plesk管理和运行在Apache/CentOS 6.

回答

4

选择的解决方案是CentOS的服务器上安装mod_xsendfile,其配置和用户身份验证后,用PHP头发送的文件。

在Centos上安装mod_xsendfile。您需要启用EPEL软件库得到xsendfile,经过一个简单的:

yum update 
yum install mod_xsendfile 

后,你可以检查模块使用正确安装:

apachectl -M | grep xsendfile 

配置/ Plesk中的一部分。 Plesk会自动生成每个httpd.conf文件,因此手动修改这些文件是非常危险的,因为它们可以被通过Plesk UI进行的任何更改覆盖。默认情况下http.conf文件包括vhost.conf和vhost_ssl.conf,虚拟主机存储在

/var/www/vhosts/system/[yourvhostname]/conf 

您可以通过ssh编辑或使用的Plesk UI界面(虚拟主机 - >服务器设置 - >附加的apache指令)。对于非Plesk用户只需添加在你的httpd.conf的虚拟主机正确节以下指令

第一次我遇到了一些问题,导致服务器被发送0字节的文件,经过一些测试,我找到了正确的指令是:

<Directory "/"> 

    EnableSendfile on 

    XSendFile on 

    # Absolute path, no trailing slash! 
    XSendFilePath "/var/www/vhosts/[yourvhostname]/storage" 

</Directory> 

请注意,如果我使用与“/”不同的目录指令,我会在任何日志中获得空文件并且完全没有错误。没有通过在标题中传递相对路径来测试发生了什么。我使用Laravel的PHP框架

原因,该文件可以被发送到用户使用:

return response(null) 
     ->header('Content-Type' , 'application/octet-stream') 
     ->header('Content-Disposition', 'attachment; '.$filename) 
     ->header('X-Sendfile', $fullfilepath); 

希望这可以帮助别人避免测试的时间。

2

上面的Dario的评论真的很有帮助。我只是想添加我用于Laravel return语句的内容,以确保文件命名正确:

return response(null) 
    ->header('Content-Type' , 'application/octet-stream') 
    ->header('Content-Disposition', 'attachment; filename="' . $filename . "') 
    ->header('X-Sendfile', $fullfilepath); 
+0

在普通的PHP头文件中只是字符串,所以'header('X-Sendfile:'。$文件路径);'会是人们想要使用的。 – dothebart