2013-05-16 28 views
0

我有一个浏览器客户端从我的Web服务中获取部分内容,例如使用Range: bytes=100000-200000。请求进入PHP页面fetch.php。在该PHP页面中,我使用$_SERVER['HTTP_RANGE']获取请求范围,然后使用curl_setopt - CURLOPT_RANGE将其设置为卷曲请求。我遇到的问题是,远程服务器以206 Partial Content状态和Content-Range标题进行响应,但我的PHP页面仅响应200 OKContent-Range,因此结果是客户认为已完成的部分文件。问题是,我如何在PHP中设置Content-Range到原始请求?如何使用PHP/cURL代理请求并代理响应头呢?

如果我知道前面的范围,我不知道,我可以使用header命令并完成它,但范围返回响应中。我可以设置curl接收所有标题的内容,然后解析出标题,使用header设置它,并将响应设置为206,然后回显所有数据......但数据是二进制的,更不用说非常大,所以这看起来不是最佳的。

我想知道如果我能以某种方式在PHP中设置一个选项,不发送任何它自己的头,基本上只是将整个响应回显给请求者。如果没有充分考虑这一点,它可能会与其他标题,但缓存,连接,代理等问题。

也许有一种方法,我可以从curl只接收标题(某种partial_execute?),得到我需要设置头文件和响应代码,然后基本完成exec和实际响应get的输出直接?我无法从卷曲中看到如何实现这一目标。

由于PHP脚本实际上确定资源的目标服务器(它不是静态的),所以设置实际的反向代理也不是真正的选项。

我想我可以跳过使用curl并直接执行TCP/TLS连接并管理HTTP请求/响应。

任何其他想法或可能性?谢谢!

回答

0

也许有一种方法,我可以从卷曲

这是HTTP协议的一部分得到公正的头,请参阅:What is the easiest way to use the HEAD command of HTTP in PHP?

我不明白是什么问题,否则。

如果您收到部分回复,可能是由于连接超时。这可以通过更改:

CURLOPT_CONNECTTIMEOUT

+0

我有一个客户机和2台服务器,代理服务器和实际的服务器:C-> P-> S上。客户端通过Range标题请求部分内容。代理使用curl将请求传递给服务器。服务器正确回应206部分内容。但是,PHP代理响应的返回值为200 OK,因此它看起来像代理服务器一样忽略了请求的部分内容,并且实际上只是部分响应。不知何故,我需要curl和PHP返回,它已经满足了正确的部分响应。 – mark

+0

对此,仍然不是100%肯定的,但在我看来,您正在通过一台服务器请求206头,然后从另一台服务器发送它。您是否不需要执行如下的操作:<?php header(“HTTP/1.0 206 Partial Content”); ?> –

+0

你是对的,我可以像你说的强制响应代码,但据我所知,我不能从主服务器的响应中获取Content-Range来放置该标头。我可以让curl返回头文件,但它也会返回所有的内容(我宁愿没有一个大的字符串)......我没有看到没有获取头文件的方法。最后,我最终成功地使用了stream_socket_client而不是curl;我会在这个问题上回答这个问题,以防其他人绊倒这个。 – mark

1

这可能是也可能不是最佳的解决方案,但它在我需要的情况下工作。基本上只是做我自己的HTTP(S)获取使用stream_socket_client确保携带必要的响应代码和头传递,如:

while (true) { 
    $h = stream_get_line($fp, 2048, "\r\n"); 
    if (!$h) { 
     break; 
    } 
    if (0==strncasecmp($h, 'Content-', 8)) { 
     header($h); 
    } 
    else if (0==strncasecmp($h, 'HTTP/1.', 7)) { 
     header($h); 
    } 
} 

fpassthru($fp);