2016-07-17 11 views
3

Zur Zeit habe ich ein Skript wie folgt aus:PHP cURL Realtime-Proxy (Stream-Datei)

<?php 
$filename = "http://someurl.com/file.ext"; 
header('Content-Type: application/octet-stream'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$filename); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 500); 
$data=curl_exec($ch); 
curl_close($ch); 
echo $data; 
?> 

Das Problem ist, dass der Server nur die gesamte Datei die Antwort nach dem Download senden. Ich möchte, dass es wie ein "Stream" funktioniert und sendet Datenpakete als Antwort, während die Datei heruntergeladen wird.

Ist das mit PHP und cURL möglich?

+0

[Dies] (http://mtdowling.com/blog/2012/01/27/chunked-encoding-in-php-with-guzzle/) könnte das sein, was Sie suchen. –

+0

Ich habe vorher noch nie einen Composer benutzt und ich bin im Shared Hosting, aber ich werde mehr darüber suchen. – kekit

Antwort

5

Es ist möglich. Sie können die Option curl CURLOPT_WRITEFUNCTION verwenden, um einen Rückruf anzugeben, bei dem Sie Datenblöcke empfangen, damit Sie sie direkt an den Client senden können, wenn curl die Datei herunterlädt.

<?php 

$filename = "http://someurl.com/file.ext"; 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$filename); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 500); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) { 
    echo $data; 
    return strlen($data); 
}); 
curl_exec($ch); 
curl_close($ch); 
+0

Getestet mit einer 5 mb Datei. Anstatt nur nach und nach die Chuncks zu senden, glaube ich, dass sie die Daten, die bereits von Anfang an übertragen wurden, oft senden, oder sie sind in gewisser Weise beschädigt. Dies erfordert eine bestimmte PHP-Version? – kekit

+0

Die write-Funktion sollte niemals die gleichen Daten zweimal erhalten. Die minimale PHP-Version ist 5.3, damit die anonyme Funktion an CURLOPT_WRITEFUNCTION übergeben werden kann. Sonst keine Anforderung. Ich versuchte es wieder mit verschiedenen Dateien von 5 MB bis 480 MB und es begann fast sofort auf meinem Computer herunterladen und die Dateien Prüfsummen abgestimmt und geöffnet gut. – drew010

+0

Ich habe endlich das Problem gefunden, wurde durch Cloudflare verursacht ... Der Code funktioniert wie erwartet. Vielen Dank. – kekit