在linux上使用modxsendfile使用PHP下载大文件

在linux上使用modxsendfile使用PHP下载大文件,php,linux,apache,plesk,x-sendfile,Php,Linux,Apache,Plesk,X Sendfile,我需要使用PHP和身份验证从我的Web服务器提供非常大的文件(1Gb+),这样只有一些客户有权下载文件 我不想使用直接链接,由于内存和超时限制,使用PHP脚本来提供文件不是一个选项 我的Web服务器使用Plesk进行管理,并在Apache/CentOS6上运行。选择的解决方案是在CentOS服务器上安装mod_xsendfile,对其进行配置,并在用户身份验证后发送带有PHP头的文件 在Centos上安装mod_xsendfile。您需要启用EPEL存储库以获取xsendfile,然后执行以下简

我需要使用
PHP
和身份验证从我的Web服务器提供非常大的文件(1Gb+),这样只有一些客户有权下载文件

我不想使用直接链接,由于内存和超时限制,使用
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界面(vhost->server settings->其他apache指令)编辑它们。对于非Plesk用户,只需在httpd.conf的正确vhost部分下添加以下指令

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

<Directory "/">

    EnableSendfile on

    XSendFile on

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

</Directory>

希望这能帮助人们避免数小时的测试。

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

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

在普通PHP中,头只是字符串,所以
头('X-Sendfile:'。$filepath)将是一个人想要使用的。
return response(null)
    ->header('Content-Type' , 'application/octet-stream')
    ->header('Content-Disposition', 'attachment; filename="' . $filename . "')
    ->header('X-Sendfile', $fullfilepath);