例如:有一个提供文件下载的网站。网站和可下载文件位于不同的服务器上。当用户尝试下载文件时,文件服务器会发送文件。在到达用户之前,文件服务器不应该首先将文件发送到网站的服务器,因为这将使用双倍的带宽。
可以使用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;
}
?>
答案 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阶段,我现在可以找出以下替代方案:
您的服务器和文件服务器至少共享其文件系统的一部分,例如用NFS。这样文件服务器可以导出下载目录,并且您的Web服务器的PHP脚本可以访问为您提供服务的可下载资源;
您的PHP脚本可以访问文件服务器所需的资源,通过(S)FTP或HTTP(S)通过秘密(即服务器到服务器)身份验证(例如通过cURL functions正确获取)其他人建议),作为第二步,服务它。
希望这有帮助。