3

我有一个浏览器客户端,它从我的网络服务中获取部分内容,例如使用Range: bytes=100000-200000. 请求进入 PHP 页面 fetch.php。在那个 PHP 页面中,我使用-获取请求的 Range,$_SERVER['HTTP_RANGE']然后将其设置为 curl 请求。我遇到的问题是,远程服务器以状态和标头响应,但我的 PHP 页面仅以 a和 no响应,因此结果是客户端认为完整的部分文件。问题是,如何在 PHP 中将结果设置为原始请求?curl_setoptCURLOPT_RANGE206 Partial ContentContent-Range200 OKContent-RangeContent-Range

如果我事先知道范围,但我不知道,我可以只使用header命令并完成它,但范围会在响应中返回。我可以在 curl 中设置以接收包含内容的所有标头,然后解析标头,使用header设置并将响应设置为 206,然后回显所有数据......但数据是二进制的,更不用说非常大了,所以这似乎是次优的,充其量。

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

也许有一种方法可以让我只接收来自 curl 的标头(某种 partial_execute?),得到我需要的东西,设置标头和响应代码,然后基本上完成 exec 并直接获得实际响应的输出?我无法从 curl 中看到如何做到这一点。

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

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

还有其他想法或可能性吗?谢谢!

4

2 回答 2

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 );
于 2013-05-17T21:03:05.187 回答
0

也许有一种方法可以让我只接收来自 curl 的标题

这是 HTTP 协议的一部分,请参阅:在 PHP 中使用 HTTP 的 HEAD 命令最简单的方法是什么?

我不明白问题是什么。

如果您收到部分响应,则可能是由于连接超时。这可以使用以下方法进行更改:

CURLOPT_CONNECTTIMEOUT

于 2013-05-17T03:02:33.803 回答