Apache / PHP可以从其他服务器提供文件吗?

时间:2014-07-14 07:22:36

标签: php apache

例如:有一个提供文件下载的网站。网站和可下载文件位于不同的服务器上。当用户尝试下载文件时,文件服务器会发送文件。在到达用户之前,文件服务器不应该首先将文件发送到网站的服务器,因为这将使用双倍的带宽。

可以使用PHP直接从文件服务器提供文件吗?

注意:单个服务器设置只需使用PHP手册中的以下代码即可。我需要将这些标头从文件服务器直接发送给用户。

<?php
$file = 'monkey.gif';

if (file_exists($file)) 
{
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>

3 个答案:

答案 0 :(得分:2)

我看到很少有可能解决这个问题。

1)它的 mount 第二个服务器目录到运行php的第一个服务器。结果,您将从已安装的目录中获取文件并将其传递给用户。

2)它向用户发送的不是文件内容,而是从另一台服务器下载链接。例如,使用重定向

header("Location: http://2nd-server-ip.com/myfile.zip");

答案 1 :(得分:0)

为什么不使用cURL?

<?php

$file = 'monkey.gif';

if (file_exists($file)) {
    $ch = curl_init();
    $timeout = 5;
    $headers = array('Content-Description' => 'File Transfer',
        'Content-Type' => 'application/octet-stream',
        'Content-Disposition' => 'attachment; filename=' . basename($file),
        'Expires' => FALSE,
        'Cache-Control' => 'must-revalidate',
        'Pragma' => 'public',
        'Content-Length' => filesize($file));
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $data = curl_exec($ch);
    curl_close($ch);
    echo $data;
}

答案 2 :(得分:0)

由于您计划通过PHP在服务器端执行此操作,因此我认为您可以通过多种方式执行此操作。

一般来说,操作分为三个阶段:

  1. 获取所需资源

  2. 将其读入字符串(如果足够小)

  3. 通过输出流

  4. 提供服务

    您正在寻找的差异在第1阶段,我现在可以找出以下替代方案:

    • 您的服务器和文件服务器至少共享其文件系统的一部分,例如用NFS。这样文件服务器可以导出下载目录,并且您的Web服务器的PHP脚本可以访问为您提供服务的可下载资源;

    • 您的PHP脚本可以访问文件服务器所需的资源,通过(S)FTP或HTTP(S)通过秘密(即服务器到服务器)身份验证(例如通过cURL functions正确获取)其他人建议),作为第二步,服务它。

    希望这有帮助。