PHP CURLOPT_WRITEFUNCTION не работает

Я пытаюсь прочитать только один кусок потока данных с помощью curl.

В идеале я хотел бы просто получить первое изображение в потоке и записать его в файл jpg.

Я пытаюсь сделать это, используя WRITEFUNCTION и возвращая -1, если длина потока> скажем, 20000.

function receiveResponse($ch,$string) {
    $length = strlen($string);
    if($length >= 20000) { return -1; }
    return $length;
}

$ch = curl_init('http://<url>/videostream.cgi');
curl_setopt($ch, CURLOPT_USERPWD, '<user>:<password>');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, "receiveResponse");
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_exec($ch);

Однако поток просто продолжает записывать в файл, который в конечном итоге становится все больше и больше в размере файла.

Я делаю что-то ужасно неправильно?

С Уважением,

2 ответа

Решение

Давайте посмотрим на описание опций из этого руководства http://www.php.net/manual/en/function.curl-setopt.php:

CURLOPT_WRITEFUNCTION Имя функции обратного вызова, где функция обратного вызова принимает два параметра. Первый - это ресурс cURL, а второй - строка с записываемыми данными. Данные должны быть сохранены с помощью этой функции обратного вызова. Он должен вернуть точное количество записанных байтов, иначе передача будет прервана с ошибкой.

Таким образом, это означает, что ответ может быть разделен на несколько частей данных. Для правильного получения первых 20000 байтов вы должны добавить счетчик $full_length:

$full_length = 0;
function receiveResponse($ch,$string) use (&$full_length) {
    $length = strlen($string);
    $full_length += $length;
    if($full_length >= 20000) { return -1; }
    return $length;
}

Попробуйте прокомментировать это curl_setopt($ch, CURLOPT_FILE, $fh);

Другие вопросы по тегам