【问题标题】:PHP How do I host a large file properly?PHP 如何正确托管大文件?
【发布时间】:2013-01-20 22:35:15
【问题描述】:

我目前正在使用以下 PHP 函数来允许用户选择一个文件然后下载它。这发生在 FTP 上。但是,如果用户选择了一个大文件,那么在下载过程中它会锁定服务器以接收任何其他请求。有什么方法可以在让 PHP 继续响应请求的同时托管文件?

我需要 PHP 来验证是否允许用户使用他们的凭据下载文件,因此我不能将其作为资产托管。该文件位于 FTP 服务器上。

function download($file) {
    $fileStream = "";
    if($this->get($file)) {
        //Send header to browser to receive a file
        header("Content-disposition: attachment; filename=\"$file\"");
        header("Content-type: application/octet-stream");
        header("Pragma: ");
        header("Cache-Control: no-cache");
        header("Expires: 0");

        $data = readfile($this->downloadDir . $file);
        $i=0;
        while ($data[$i] != "")
        {
            $fileStream .= $data[$i];
            $i++;
        }
        unlink($this->downloadDir . $file);
        echo $fileStream;
        exit;
    } else {
        return false;
    }
}

【问题讨论】:

  • 这是通过 FTP 发生的?
  • 抱歉我忘了解释 $this->get($file) 将它下载到服务器上的 tmp 文件夹。然后它将它提供给用户。下载到 tmp 文件夹几乎是立即发生的,因为 FTP 服务器与 Web 服务器位于同一网络上。
  • @drdanielfc 使用 mod_xsendfile tn123.org/mod_xsendfile

标签: php html ftp timeout request


【解决方案1】:

PHP 不是此类工作的最佳解决方案,但它可以将工作委托给您正在使用的 Web 服务器。由于该文件与您的应用程序位于同一位置,因此可以正常工作。

通常运行 PHP 应用程序(Apachelighttpdnginx)的所有主要 Web 服务器都支持 XSendfile

要使用它,您必须首先在您的网络服务器中启用该功能(检查上面每个网络服务器的链接),然后在您的脚本中添加一个新标头:

阿帕奇:

header("X-Sendfile: $location_of_file_to_download");

Lighttpd:

header("X-LIGHTTPD-send-file: $location_of_file_to_download");

nginx:

header("X-Accel-Redirect: $location_of_file_to_download");

Web 服务器将从您的应用程序中捕获此标头,并将您的 PHP 响应的正文替换为该文件。当它将这个文件提供给用户时,PHP 会被解除阻塞并准备好为新用户提供服务。

(将保留其他标头,因此您可以保留 content-type 和 content-disposition 标头)

【讨论】:

    【解决方案2】:

    由于 PHP 是单线程的,因此您必须为每个请求创建一个结构。然后,您不应一次只处理一个请求,而应遍历这些结构并缓慢地同时处理所有请求(例如将几百 kb 发送到一个请求,然后移至下一个,等等)。

    老实说,PHP 听起来并不适合做这项工作。为什么不使用专门构建的 FTP 服务器,例如 vsftp 或类似的东西?

    【讨论】:

    • 我需要一个 FTP 服务器的前端。我也不能只将用户重定向到 FTP 下载位置,因为 FTP 服务器需要凭据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2019-07-21
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多