代码之家  ›  专栏  ›  技术社区  ›  Steve Hanov

为什么php fread()函数有时会在每一行前面加上它的长度?

  •  0
  • Steve Hanov  · 技术社区  · 15 年前

    我使用PHP从套接字执行POST请求。下面是一段代码:

    // open a socket connection on port 80
    $fp = fsockopen($host, 80);
    
    // send the request headers:
    fwrite($fp, "POST $path HTTP/1.1\r\n");
    fwrite($fp, "Host: $host\r\n");
    fwrite($fp, "Referer: $referer\r\n");
    fwrite($fp, "Content-type: application/x-www-form-urlencoded\r\n");
    fwrite($fp, "Content-length: ". strlen($data) ."\r\n");
    fwrite($fp, "Connection: close\r\n\r\n");
    fwrite($fp, $data);
    
    $result = ''; 
    while(!feof($fp)) {
        // receive the results of the request
        $result .= fread($fp, 5000);
    }
    

    但是,响应的每一行似乎都以其十六进制长度作为前缀。为什么会这样?

    例如,我发布的测试cgi脚本返回其环境:

    BASH=/bin/bash
    BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
    BASH_ALIASES=()
    BASH_ARGC=()
    BASH_ARGV=()
    

    但我的PHP函数的结果是:

    f
    BASH=/bin/bash
    
    69
    BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
    
    10
    BASH_ALIASES=()
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   mario    15 年前

    你应该用 HTTP/1.0 ,因为1.1服务器通常使用传输编码进行响应: chunked (=以十六进制数字为前缀的部件)。

    你可以试着发出请求 identity 内容编码,但所有HTTP/1.1客户机都要求使用分块传输格式,因此这可能不可靠。

        2
  •  1
  •   KingCrunch    15 年前

    不是每一行,它的前缀是它的长度。正如mario建议的那样,服务器将数据发送为 分块 . 每个块都以块的长度、数据和双换行符(=>空行)开头。块本身可以包含任何有效的(就http而言)数据,这意味着它也可以包含多行。

    你可以自己用这个。如果你收到一个分块的转账,你可以给 弗雷德() 块的长度作为参数而不是abritary int(这里是5000)。所以你会立刻收到全部的钱。

    推荐文章