我需要使用PHP
和身份验证从我的网络服务器提供非常大的文件(1Gb +),以便只有某些客户才有权下载文件。使用linux上的mod_xsendfile使用PHP下载大文件
由于内存和超时限制,我不想使用直接链接并使用PHP
脚本来提供文件不是一个选项。
我的web服务器与Plesk
管理和运行在Apache
/CentOS
6.
我需要使用PHP
和身份验证从我的网络服务器提供非常大的文件(1Gb +),以便只有某些客户才有权下载文件。使用linux上的mod_xsendfile使用PHP下载大文件
由于内存和超时限制,我不想使用直接链接并使用PHP
脚本来提供文件不是一个选项。
我的web服务器与Plesk
管理和运行在Apache
/CentOS
6.
选择的解决方案是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);
希望这可以帮助别人避免测试的时间。
上面的Dario的评论真的很有帮助。我只是想添加我用于Laravel return语句的内容,以确保文件命名正确:
return response(null)
->header('Content-Type' , 'application/octet-stream')
->header('Content-Disposition', 'attachment; filename="' . $filename . "')
->header('X-Sendfile', $fullfilepath);
在普通的PHP头文件中只是字符串,所以'header('X-Sendfile:'。$文件路径);'会是人们想要使用的。 – dothebart