Jak częściowo pobrać zdalny plik za pomocą cURL?

Czy możliwe jest częściowe pobranie zdalnego pliku za pomocą cURL? Załóżmy, że rzeczywisty rozmiar pliku zdalnego wynosi 1000 KB. Jak mogę pobrać tylko pierwsze 500 KB?

 21
Author: boast, 2010-01-09

4 answers

Można również ustawić parametr nagłówka zakresu z rozszerzeniem PHP-curl.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.spiegel.de/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

Ale jak wspomniano wcześniej, jeśli serwer nie honoruje tego nagłówka, ale wysyła cały plik curl pobierze wszystko. Np. http://www.php.net ignoruje nagłówek. Ale można (dodatkowo) ustawić funkcję write callback i przerwać żądanie po otrzymaniu większej ilości danych, np.

// php 5.3+ only
// use function writefn($ch, $chunk) { ... } for earlier versions
$writefn = function($ch, $chunk) { 
  static $data='';
  static $limit = 500; // 500 bytes, it's only a test

  $len = strlen($data) + strlen($chunk);
  if ($len >= $limit ) {
    $data .= substr($chunk, 0, $limit-strlen($data));
    echo strlen($data) , ' ', $data;
    return -1;
  }

  $data .= $chunk;
  return strlen($chunk);
};

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
$result = curl_exec($ch);
curl_close($ch);
 34
Author: VolkerK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 13:10:18

Pobranie pierwszych 100 bajtów dokumentu:

curl -r 0-99 http://www.get.this

Z podręcznika

Upewnij się, że masz nowoczesny curl

 17
Author: SpliFF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 02:42:44

Dzięki za miłe rozwiązanie VolkerK. Jednak musiałem użyć tego kodu jako funkcji, więc oto, co wymyśliłem. Mam nadzieję, że przyda się innym. Główną różnicą jest use ($limit, & $ datadump) , więc limit może być przekazywany i używając zmiennej referencyjnej $datadump, aby móc go zwrócić w wyniku. Dodałem również CURLOPT_USERAGENT, ponieważ niektóre strony internetowe nie zezwalają na dostęp bez nagłówka user-agent.

Sprawdź http://php.net/manual/en/functions.anonymous.php

function curl_get_contents_partial($url, $limit) {
  $writefn = function($ch, $chunk) use ($limit, &$datadump) { 
    static $data = '';

    $len = strlen($data) + strlen($chunk);
    if ($len >= $limit) {
      $data .= substr($chunk, 0, $limit - strlen($data));
      $datadump = $data;
      return -1;
    }
    $data .= $chunk;
    return strlen($chunk);
  };

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
  //curl_setopt($ch, CURLOPT_RANGE, '0-1000'); //not honored by many sites, maybe just remove it altogether.
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
  curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
  $data = curl_exec($ch);
  curl_close($ch);
  return $datadump;
}

Usage:
$page = curl_get_contents_partial (' http://some.webpage.com', 1000); // przeczytaj pierwsze 1000 bajtów
echo $page / / lub zrób cokolwiek z wynikiem.

 1
Author: upteryx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 17:58:44

To moĹźe byÄ ‡ Twoje rozwiÄ ... zanie (Pobierz pierwsze 500KB do wyjĹ " cia .txt )

curl -r 0-511999 http://www.yourwebsite.com > output.txt
  • while 511999 is 500^1024-1
 0
Author: amir beygi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 12:41:25