2010-01-09 28 views

Trả lời

34

Bạn cũng có thể thiết lập các thông số tiêu đề phạm vi với phần mở rộng 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; 

Nhưng như đã nói trước nếu máy chủ không tôn trọng tiêu đề này nhưng gửi toàn bộ curl file sẽ tải về tất cả của nó. Ví dụ. http://www.php.net bỏ qua tiêu đề. Nhưng bạn có thể (ngoài ra) đặt chức năng gọi lại ghi và hủy yêu cầu khi nhận được nhiều dữ liệu hơn, ví dụ:

// 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); 
+0

+1 để có câu trả lời hay. Điều này làm việc vì $ writefn() trả về -1 khi đạt đến giới hạn. Khi hàm gọi lại trả về bất cứ điều gì khác hơn số byte được truyền cho nó (trong $ chunk), curl hủy bỏ kết nối. – GZipp

+0

Tuyệt vời. Khi tôi đang làm như vậy trong Perl, tôi đã phải sử dụng một báo động kích hoạt và kiểm tra kích thước tập tin, vì thiếu một phương pháp tốt hơn. Rất hacky nhưng nó hoạt động. –

+0

Chỉ là những gì tôi cần. Tuy nhiên, đáng nói đến cũng là CURLOPT_BUFFERSIZE xác định kích thước 'chunk'. Vì vậy, nếu bộ đệm của bạn là rất lớn, kích thước chunk có thể dễ dàng chứa một trang web đầy đủ của dữ liệu nào (tôi nghĩ!) –

17

Lấy 100 byte đầu tiên của một tài liệu:

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

từ hướng dẫn

chắc chắn rằng bạn có một curl hiện đại

+3

Bạn chính xác, tuy nhiên tôi thấy rằng nó không phải lúc nào cũng đáng tin cậy và phụ thuộc trên máy chủ và không tự cuộn tròn. Trong trường hợp không đúng, curl sẽ chỉ tiếp tục tải xuống. –

+0

Tôi không thể tải xuống khi tôi sử dụng một phạm vi khác, ví dụ: 100-200. Tôi nhận được "lỗi curl (18)". Điều này có thể được giải quyết? – akashrajkn

0

Đây có thể là giải pháp của bạn (tải đầu tiên 500KB vào output.txt)

curl -r 0-511999 http://www.yourwebsite.com > output.txt 
  • khi 511999500^1024-1
0

Cảm ơn giải pháp tốt đẹp VolkerK. Tuy nhiên tôi cần phải sử dụng mã này như một hàm, vì vậy đây là những gì tôi đã đưa ra. Tôi hy vọng nó hữu ích cho người khác. Sự khác biệt chính là sử dụng (giới hạn $, & $ datadump) để giới hạn có thể được chuyển và sử dụng biến tham chiếu $ datadump để có thể trả về kết quả. Tôi cũng đã thêm CURLOPT_USERAGENT vì một số trang web sẽ không cho phép truy cập mà không có tiêu đề tác nhân người dùng.

Kiểm tra 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; 
} 

sử dụng: $
page = curl_get_contents_partial ('http://some.webpage.com', 1000); // đọc số đầu tiên 1000 byte
echo $ page // hoặc làm bất cứ điều gì với kết quả.

Các vấn đề liên quan