2013-05-09 42 views
5

Curl có nhiều tùy chọn giúp trường hợp sử dụng của tôi dễ dàng hơn để yêu cầu dữ liệu từ một máy chủ khác. Kịch bản của tôi tương tự như một proxy và cho đến nay nó yêu cầu dữ liệu từ một máy chủ khác và sau khi dữ liệu kết quả hoàn tất, nó gửi cho khách hàng cùng một lúc.PHP: chuyển tiếp curl và luồng

  1. người dùng truy cập http://te.st/proxy.php?get=xyz

  2. proxy.php tải xyz từ bên ngoài-server

  3. khi quá trình download hoàn thành 100%, nó sẽ ra các dữ liệu

Bây giờ Tôi tự hỏi liệu 2 và 3 cũng có thể được thực hiện song song (với php5-curl), giống như một "luồng proxy" để chuyển tiếp dữ liệu mà không cần chờ e dòng cuối cùng.

Nếu kích thước tệp trung bình là 20MB, điều này tạo ra sự khác biệt đáng kể.

Có tùy chọn cho điều này trong curl không?

Trả lời

6

Hãy xem http://www.php.net/manual/en/function.curl-setopt.php#26239

Something như thế (không kiểm tra):

function myProgressFunc($ch, $str){ 
    echo $str; 
    return strlen($str); 
} 

curl_setopt($ch, CURLOPT_WRITEFUNCTION, "myProgressFunc"); 

đọc cũng ParallelCurl with CURLOPT_WRITEFUNCTION

+0

Tốt nhưng không hoàn hảo: được đệm. Điều này có nghĩa là nó có thể được sử dụng để truyền tệp, nhưng khi nó là một luồng sự kiện, các sự kiện mới nhất được treo không thể truy cập bên trong curl ('flush()' không giúp 'echo' tất cả). Thật tiếc. +1 cho bạn anyway. – user

1

Đây là mã mà thực sự suối các tập tin thay vì chờ cho đầy đủ tập tin vào bộ đệm.

$url = YOUR_URL_HERE; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) { 
    echo $data; 
    ob_flush(); 
    flush(); 
    return strlen($data); 
}); 
curl_exec($ch); 
curl_close($ch);