Kısmi web sayfasını almak

4 Cevap php

Veri CURL miktarını alıp sınırlayan herhangi bir yolu var mı? Ancak ben gerektiren veri sayfasının üst 1/4 kadar ben gerçekten sadece sayfanın ilk 10kb almak için ihtiyaç vardır, ekran 50kb bir sayfa kapalı veri kazıma değilim.

Ben sadece bu bant genişliği 5GB hakkında ilgili olduğu zaman bana, aylık verilerin 60GB yakın transfer sonuçları hangi izlemek için gereken veri bir çok şey var, çünkü ben soruyorum.

Ben verileri işlemek için PHP kullanıyorum, ancak ben benim veri alma yaklaşımında esnek değilim, CURL, wget, fopen vs kullanabilirsiniz

Ben düşünüyorum Bir yaklaşım

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

Yukarıda sadece www.website.com gelen 6kB transfer olacak, ya da ben hala tam 50kb transfer olacak yani belleğe yük www.website.com fopen anlamına mı geliyor?

4 Cevap

Ayrıca siz de CURL kullanarak aradığınız ne başarmak mümkün olabilir.

Eğer CURLOPT_WRITEFUNCTION veri CURL okuma için kullanılabilir olduğunda denir bir geri kaydedebilirsiniz için belgelerine bakarsanız. Daha sonra alınan byte olabilir, ve 6.000 'den fazla byte aldık zaman transfer kalanını iptal etmek için 0 dönebilirsiniz.

libcurl belgeleri biraz daha geri arama açıklar:

This function gets called by libcurl as soon as there is data received that needs to be saved. Return the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library and it will abort the transfer and return CURLE_WRITE_ERROR.

The callback function will be passed as much data as possible in all invokes, but you cannot possibly make any assumptions. It may be one byte, it may be thousands.

Bu aslında bir CURL soru daha bir HTTP olduğunu.

Tahmin ettiğiniz gibi, bütün sayfa fopen kullanırsanız indirilebilir olacak. Size aramak olursa olsun o 5000 veya ofset.

Ne istediğinizi elde etmek için en iyi yolu, HTML RFC belirtildiği gibi, kısmi bir HTTP GET isteği kullanmak olacaktır (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html):

The semantics of the GET method change to a "partial GET" if the request message includes a Range header field. A partial GET requests that only part of the entity be transferred, as described in section 14.35. The partial GET method is intended to reduce unnecessary network usage by allowing partially-retrieved entities to be completed without transferring data already held by the client.

The details of partial GET requests using Ranges is described here: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

Bir try HTTP RANGE request:

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

if the server supports range requests, bir Content-Range başlığı ve bayt senin talep aralığı (öyle değil, eğer 200 ve tüm dosya dönecektir) ile 206 Kısmi İçerik yanıt kodunu verecektir. aralık istekleri güzel bir açıklama için http://benramsey.com/archives/206-partial-content-and-range-requests/ bkz.

ayrıca bkz Resumable downloads when using PHP to send the file?.

Bu fopen çağrısı ile tüm sayfayı indirir, ama sonra yalnızca bu sayfadan 6kb okuyacaktır.

PHP manuel:

Kısa sürede aşağıdaki koşullardan biri karşılandığında gibi durur Okuma:

  • length bayt okununca