2013-05-09 18 views
5

Curl hat viele Optionen, die es für meinen Anwendungsfall einfacher machen, Daten von einem anderen Server anzufordern. Mein Skript ist ähnlich wie ein Proxy und bis jetzt fordert es die Daten von einem anderen Server an und sobald die Ergebnisdaten vollständig sind, wird es sofort an den Client gesendet. JetztPHP: curl und stream Weiterleitung

  1. Benutzer besucht http://te.st/proxy.php?get=xyz

  2. proxy.php Downloads xyz von einem externen Server

  3. , wenn der Download zu 100% abgeschlossen ist, gibt er die Daten

Ich frage mich, ob 2 und 3 auch parallel (mit php5-curl) gemacht werden können, wie ein "Proxy-Stream", der Daten spontan weiterleitet, ohne auf sie zu warten Die letzte Zeile.

Wenn die Dateigröße durchschnittlich 20 MB beträgt, ist dies ein wesentlicher Unterschied.

Gibt es dafür eine Option in curl?

Antwort

6

Werfen Sie einen Blick auf http://www.php.net/manual/en/function.curl-setopt.php#26239

So etwas Ähnliches (nicht getestet):

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

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

Lesen Sie auch ParallelCurl with CURLOPT_WRITEFUNCTION

+0

Gut, aber nicht perfekt: es ist gepuffert. Dies bedeutet, dass es für Datei-Streaming verwendet werden kann, aber wenn es sich um einen Ereignis-Stream handelt, hängen die letzten Ereignisse innerhalb der Curl nicht erreichbar ('flush()' hilft nicht, alle zu "echo"). Das ist schade. +1 für dich trotzdem. – user

1

Hier ist der Code, der die Dateien tatsächlich Streams stattdessen voll des Wartens Datei zum Puffern.

$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);