我有一个浏览器客户端从我的网络服务中获取部分内容,例如使用Range: bytes=100000-200000
。请求进入PHP页面fetch.php。在该PHP页面中,我使用$_SERVER['HTTP_RANGE']
获取请求的范围,然后使用curl_setopt
- CURLOPT_RANGE
将其设置为curl请求。我遇到的问题是,远程服务器使用206 Partial Content
状态和Content-Range
标头进行响应,但我的PHP页面只响应200 OK
而没有Content-Range
,因此结果是客户认为完整的部分文件。问题是,如何在PHP中设置原始请求的结果Content-Range
?
如果我知道前面的范围,我不知道,我可以使用header
命令并完成它,但在响应中返回Range。我可以在curl中设置接收包含内容的所有标头然后解析标头,使用header
设置它并将响应设置为206然后回显所有数据...但数据是二进制的,而不是提到非常大,所以这似乎是次优的,充其量。
我想知道我是否能以某种方式在PHP中设置一个选项,以便不发送它自己的任何标头,并且基本上只是将整个响应回送给请求者。如果没有充分考虑这一点,可能会出现其他标题,缓存,连接,代理等问题。
也许有一种方法我只能收到curl的头文件(某种partial_execute?),得到我需要的东西,设置头文件和响应代码,然后基本上完成exec和实际响应get的输出?我无法从卷曲中看到如何实现这一目标。
设置实际的反向代理也不是一个选项,因为PHP脚本实际上确定了资源的目标服务器(它不是静态的)。
我想我可以跳过使用curl并直接进行TCP / TLS连接并管理HTTP请求/响应。
还有其他想法或可能吗?谢谢!
答案 0 :(得分:1)
它可能是也可能不是最佳解决方案,但它适用于我需要的场景。基本上只需使用stream_socket_client
进行自己的HTTP(S)获取,确保传递必要的响应代码和标题,例如:
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 );
答案 1 :(得分:0)
也许有一种方法我只能收到来自curl的标题
这是HTTP协议的一部分,请参阅:What is the easiest way to use the HEAD command of HTTP in PHP?
我不明白其他问题是什么。
如果您收到部分回复,可能是由于连接超时。这可以使用以下方式更改:
CURLOPT_CONNECTTIMEOUT