Question

Est-il possible de limiter la quantité de CURL de données va chercher? Je suis des données de grattage hors écran une page qui est 50KB, mais les données que je requiers est dans le 1/4 haut de la page, donc je vraiment besoin de récupérer la première 10kb de la page.

Je demande parce qu'il ya beaucoup de données que je dois surveiller ce qui se traduit en me transférer près de 60 Go de données par mois, alors que seulement 5 Go de cette bande passante est pertinente.

J'utilise PHP pour traiter les données, mais je suis flexible dans mon approche de récupération de données, je peux utiliser CURL, WGET, fopen etc.

Une approche J'envisage est

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

Est-ce que ce qui précède veut dire que je ne vais transférer 6kb de www.website.com, ou sera fopen charge www.website.com en mémoire ce qui signifie que je vais encore transférer le plein 50kb?

Était-ce utile?

La solution

Vous pouvez être en mesure d'accomplir aussi ce que vous cherchez en utilisant CURL aussi bien.

Si vous regardez la documentation CURLOPT_WRITEFUNCTION peut enregistrer un rappel qui est appelée chaque fois que les données sont disponibles pour la lecture de CURL. Vous pouvez ensuite compter les octets reçus, et quand vous avez reçu plus de 6000 octets, vous pouvez retourner 0 pour annuler le reste du transfert.

Le libcurl documentation décrit le rappel un peu plus:

  

Cette fonction est appelée par libcurl dès qu'il est reçu des données qui doit être   enregistré. Retourne le nombre d'octets   effectivement pris en charge. Si ce montant   diffère du montant passé à votre   fonction, il va signaler une erreur au   bibliothèque et il abandonnera le transfert   et le retour CURLE_WRITE_ERROR.

     

La fonction de rappel sera transmis   autant de données que possible dans tous les   Invoque, mais vous ne pouvez pas éventuellement faire   toutes les hypothèses. Il peut être un octet,   il peut être des milliers.

Autres conseils

Ceci est plus HTTP qu'une question CURL en fait.

Comme vous l'aurez deviné, la page entière va être téléchargé si vous utilisez fopen. Peu importe alors si vous cherchez à l'offset 5000 ou non.

La meilleure façon d'obtenir ce que vous voulez serait d'utiliser une requête HTTP GET partielle, comme indiqué dans la RFC HTML ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html ):

  

La sémantique du changement de méthode GET   à une « GET partielle » si la demande   message comprend un champ d'en-tête Range.   A la demande GET partielles que seule une partie   de l'entité doit être transférée, en tant que   décrit à la section 14.35. le   procédé GET partielle est destinée à   réduire l'utilisation du réseau inutile par   permettant aux entités partiellement récupérées   à remplir sans transférer   les données déjà détenues par le client.

Les détails des demandes partielles GET en utilisant des plages est décrite ici: http://www.w3.org/Protocols/rfc2616/ RFC2616-sec14.html # sec14.35.2

essayez HTTP demande RANGE:

GET /largefile.html HTTP/1.1
Range: bytes=0-6000

si le serveur prend en charge les demandes de plage , il retournera un 206 code de réponse contenu partiel avec un en-tête Content-Range et votre plage demandée d'octets (si elle ne est pas, il retournera 200 et le fichier entier). voir http://benramsey.com/archives/206-partial- contenu et-gamme-requests / pour une bonne explication des demandes de gamme.

voir aussi téléchargements réactivables lorsque vous utilisez PHP pour envoyer le fichier .

Il téléchargera la page entière avec l'appel fopen, mais il ne lit 6kb de cette page.

A partir du manuel PHP:

  

Lecture arrête dès que l'une des conditions suivantes est remplie:

     
      
  • longueur octets ont été lus
  •   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top