2010-08-07 17 views
11

steampowered.com adresindeki profilleri okumak için PHP'nin cURL işlevini kullanıyorum. Elde edilen veriler XML'dir ve sadece ilk kabaca 1000 bayta ihtiyaç vardır.PHP'nin cURL işlevinin indirme boyutunu sınırlandırmada sorun yaşıyorsanız

Kullandığım yöntem, Yığın Taşması yanıtında (curl: How to limit size of GET?) okuduğum bir Aralık başlığı eklemek. Denedim başka bir yöntem curlopt_range kullanıyordu ama bu da işe yaramadı.

<? 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_HTTPHEADER, array("Range: bytes=0-1000")); 

$data_string = curl_exec($curl_handle); 

echo $data_string; 

curl_close($curl_handle); 
?> 

Bu kod yürütüldüğünde, her şeyi döndürür.

PHP Sürüm 5.2.14 kullanıyorum.

+3

emin sen destekleri aralığı sorgulama sunucu vardır? Çünkü komut satırından denediğimde tüm dokümanı da alıyorum, bu da bana steamcommunity.com'un bu işlevi etkinleştirmediğine inanmamı sağlıyor – Doon

cevap

18

sunucu Aralığı başlığını dikkate almaz. Yapabileceğiniz en iyi şey, istediğinizden daha fazla veri alır almaz bağlantıyı iptal etmektir. Örnek:

<?php 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

$data_string = ""; 
function write_function($handle, $data) { 
    global $data_string; 
    $data_string .= $data; 
    if (strlen($data_string) > 1000) { 
     return 0; 
    } 
    else 
     return strlen($data); 
} 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_WRITEFUNCTION, 'write_function'); 

curl_exec($curl_handle); 

echo $data_string; 

Belki daha temiz, http sarmalayıcı (o --with-curlwrappers ile derlendiği takdirde bu da curl kullanmak istiyorsunuz) de kullanabilir. Temel olarak, bir döngüde fread'u ve daha fazla veri aldığınızda akışta fclose'u çağırırsınız. Ayrıca (yerine fopen arasında fsockopen kullanarak akışı açıp elle başlıklarını gönderme) bir ulaşım akışını kullanmak allow_url_fopen devre dışı bırakılırsa olabilir.

+0

Bu hile yaptı! Yine de, CURLOPT_WRITEFUNCTION aracının mekaniğini tam olarak anlamadım. Orada neler olduğunu açıklayabilir misin? Tekrar teşekkürler. – Curtis

+1

@Cur Her yeni veri alındığında curl uzantısı tarafından çağrılan bir geri çağırma. Geri arama, curl işleyicisini ve sadece okunan verileri alır. Okunan bayt sayısını döndürmelidir, eğer değilse, aktarımı iptal eder (bu son kısım belgelenmemiş olsa da, davranış gibi görünmektedir). – Artefacto

+2

@Cur Tamam burada docs bulundu: "aslında halledilir bayt sayısını döndürür bu tutar işlevine aktarılan miktarın farklıysa, o bu transferi ve getiri iptal edecek kütüphanesine bir hata sinyali edeceğiz.. CURLE_WRITE_ERROR." http://curl.haxx.se/libcurl/c/curl_easy_setopt.html – Artefacto

İlgili konular