PHP 直接卷曲 Download/Stream 部分内容

PHP Curl direct Download/Stream Partial Content

我想 send/stream 其他 Website/Webadress 的文件直接发送给用户,而不将文件存储在我的服务器上。这些文件是大约 100MB 到 1GB 的档案

单线程下载没问题。这是我的代码:

$ch5 = curl_init();
if (isset($_SERVER['HTTP_RANGE'])) {
    //
    preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
    $offset = intval($matches[1]);
    $end = $matches[2] || $matches[2] === '0' ? intval($matches[2]) : $size - 1;
    curl_setopt($ch5, CURLOPT_RANGE, "$offset-$end");
}
curl_setopt($ch5, CURLOPT_URL, $direct_link);
curl_setopt($ch5, CURLOPT_TIMEOUT, 3550); 
curl_setopt($ch5, CURLOPT_CONNECTTIMEOUT, 15); 
curl_setopt($ch5, CURLOPT_HEADERFUNCTION, 'readHeader');
curl_exec($ch5);
$dlsize = curl_getinfo($ch5,CURLINFO_SIZE_DOWNLOAD );
$time = curl_getinfo($ch5,CURLINFO_TOTAL_TIME);
curl_close($ch5);

function readHeader($ch, $header) // Send header from the Downloaded file to the User
{
    header($header);
    return strlen($header);
}

问题是,如果请求包含 "Range: bytes=0-" 之类的范围,PHP 下载完整文件并将其发送给用户。但是用户下载速度慢得多(导致下载速度较慢)然后将其下载到我的服务器,但是如果文件已完全下载,则该文件在外部服务器上不可用。 当客户端为下半年或其他请求发出范围请求时,请求转到外部服务器并且文件不可用,因为它已经被第一个请求完全下载,但我无法访问数据或在那里一种获取这些数据而不将它们保存在我的磁盘上的方法?

我想节省带宽并让用户可以发出范围请求。 所以PHP应该只下载用户真正想要下载的数量或者在外部服务器和用户之间建立直接连接。

实际上我在 Ubuntu 12.04.5

上使用 nginx/1.6.2 和 PHP 5.5.20-1

我通过将 nginx 与 X-Sendfile/X-Accel-Redirect 一起使用解决了我的问题。更多信息在这里:wiki.nginx.org/XSendfile