Почему функция php fread () иногда ставит перед каждой строкой ее длину? - PullRequest
0 голосов
/ 24 ноября 2010

Я использую 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 заканчивается так:1010 *

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Вы должны использовать HTTP/1.0, потому что серверы 1.1 обычно отвечают с помощью Transfer-Encoding: chunked (= это части с префиксом шестнадцатеричных чисел).

Вы можете попытаться отправить запрос с просьбойдля identity кодирования содержимого, но chunked требуется от всех клиентов HTTP / 1.1 в качестве формата передачи, так что это может быть ненадежным.

1 голос
/ 24 ноября 2010

Это не каждая строка, которой предшествует его длина. Как предположил Марио, Сервер отправляет данные как chunked . Каждый фрагмент начинается с длины фрагмента, данных и двойной новой строки (=> пустая строка). Сам блок может содержать любые допустимые (с точки зрения http) данные, что означает, что он также может содержать несколько строк.

Вы можете использовать это для себя. Если вы получаете чанк-передачу, вы можете указать fread () длину чанка в качестве параметра вместо аббревиатуры int (здесь: 5000) Таким образом, вы получите весь кусок сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...