2013-05-09 16 views
5

Curl ma wiele opcji, które ułatwiają wykorzystanie mojego przypadku do żądania danych z innego serwera. Mój skrypt jest podobny do proxy i do tej pory żąda danych z innego serwera i po zakończeniu danych wynikowych jest wysyłany do klienta od razu.PHP: zwijanie i przesyłanie strumieniowe

  1. użytkownik odwiedza http://te.st/proxy.php?get=xyz

  2. proxy.php pliki do pobrania xyz z zewnętrznego serwera

  3. po zakończeniu pobierania 100%, to wyświetli dane

teraz Zastanawiam się, czy 2 i 3 mogą być również wykonywane równolegle (z php5-curl), jak "strumień proxy", który przekazuje dane w locie, nie czekając na e ostatnia linia.

Jeśli rozmiar pliku wynosi średnio 20 MB, robi to znaczącą różnicę.

Czy istnieje opcja dla tego w curl?

Odpowiedz

6

Spójrz na http://www.php.net/manual/en/function.curl-setopt.php#26239

coś takiego (nie badane):

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

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

Czytaj także ParallelCurl with CURLOPT_WRITEFUNCTION

+0

Dobra, ale nie idealna: jest zbuforowana. Oznacza to, że może być używany do strumieniowego przesyłania plików, ale gdy jest to strumień zdarzeń, ostatnie zdarzenia są zawieszone poza zasięgiem curl ('flush()' nie pomaga 'echo' je wszystkie). Szkoda. +1 do ciebie w każdym razie. – user

1

Oto kod, który faktycznie strumieni plików zamiast czekać na pełny plik do bufora.

$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); 
Powiązane problemy