| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

22-01-2009, 09:09
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
file_put_contents und resume
Hallo zusammen,
ich versuche, mit file_get_contents eine flv-Datei von einem anderen Server zu laden. Mit kurzen Filmen (< 1 min) geht das auch wunderbar. Bei längeren Filmen startet der Download immer wieder neu...
PHP-Code:
echo "Start";
// get data from the site
if(!$handle = @fopen($downloadURL, 'r')) {
echo "ERR";
return;
}
file_put_contents('file.flv', $handle);
Mit "neu starten" meine ich, dass "Start" immer wieder ausgegeben wird. Wie kann ich da ein Handling für bauen, dass der Download resumed wird, wenn die Gegenseite den zurücksetzt? Oder liegt es an der Verwendung von file_put_contents, macht man sowas lieber mit fopen bzw. fsockopen? Wenn ich dann eine andere Seite auf meinem Server aufrufe und den Download damit "abbreche", erhalte ich einen 500. Ein Refresh der anderen Seite funktioniert dann wieder. Also etwas blöd alles :-)
VIELEN DANK!
strauberry
|

22-01-2009, 10:20
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Download mit file_put_contents ist schon mal ganz großer Käse. Und die file_*_contents-Funktionen benötigen keinen Filehandle. Dein Codeschnippselchen macht kein Sinn...
|

22-01-2009, 10:23
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
Hallo,
danke für den ähh Hinweis :-)
PHP-Doku: "If data is a stream resource, the remaining buffer of that stream will be copied to the specified file."
Wie wäre es denn besser gelöst?
Mit fopen und dann eine while-Schleife, bis das Ende des Streams erreicht ist?
Danke!
|

22-01-2009, 10:25
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Ah ok, dann will ich nichts gesagt haben. Aber du sprichst doch von Download, wieso dann file_put_contents?
|

22-01-2009, 10:28
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
Ich hab die Doku so verstanden, dass man mit file_put_contents Daten in eine Datei schreiben kann und wenn der zweite Parameter ein Stream ist, nimmt er das als Datenquelle. Den Stream öffne ich davor mit fopen und einer URL (fopen('http://www.xyz.de/file.flv')).
Daher Download :-)
Wenn es da einen anderen Weg oder eine schöne Klasse im PEAR oder so gibt, nehme ich die auch gerne.
|

22-01-2009, 11:16
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Was hältst du denn von file_get_contents bzw. stream_get_contents? file_put_contents ist zum Schreiben von Daten da, entspräche also einem Upload.
|

22-01-2009, 11:23
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
Super, werde ich mal ausprobieren...
Wie sieht's mit der Alternative aus?
PHP-Code:
$handle = fopen ("http://www.youtube.com/get_video?video_id=NpUdTFMitYA&t=XXX&el=detailpage&ps=", "r");
$buffer = '';
while (!feof($handle)) {
$buffer .= fgets($handle);
}
fclose ($handle);
file_put_contents('test.flv', $buffer);
Hat bei mir lokal funktioniert... Ist das Geschmackssache oder hat eine der beiden Varianten besondere Vorteile?
Danke PHP-Desaster :-)
|

22-01-2009, 11:40
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Was du da mit fopen, fgets, feof und fclose machst, kapselt dir file_get_contents bereits alles, darum würde ich das vorziehen. Pass aber auf, dass deine Lösung mit deaktiviertem allow_url_fopen nicht läuft.
|

22-01-2009, 11:48
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
Alles klar, danke!
Hab in den Kommentaren auch was interessantes gefunden:
Zitat:
some times this functions cause an max execution time time error, Why?
Simple, if you use it the function wait for have the specified byte length into the resource or the end of file, but, several times this not happend, so we need implement an artificial flag like this:
$tmp = stream_get_contents($this->socket, 42);
while($tmp[42] != 'N'){
//Your code...
$tmp = stream_get_contents($this->socket, 42);
}
|
Wobei das die Methode doch eigentlich selbts handelt, wenn der zweite Parameter nicht explizit gesetzt ist, oder?
|

22-01-2009, 18:33
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
Mit stream_get_contents habe ich leider den gleichen Effekt 
Aber auch nur bei youtube. Clipfish, myVideo und andere funktionieren wunderbar...
|

22-01-2009, 21:40
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Bei der Lösung mit $buffer musst du das memory_limit im Auge behalten. Schließlich ziehst du die Daten komplett in eine Variable, bevor du sie in eine Datei schreibst.
Mit file_put_contents(..., <stream>) hast du dieses Problem nicht.
Die Sache mit dem "Neustart": Wenn "Start" immer wieder ausgegeben wird, heißt das, dein gesamtes Script startet immer wieder von vorn. Das hat nichts mit deinem Grab zu tun. Vermutlich schickt der Client ständig einen neuen Request.
PS: Ich weiß ja nicht, was du mit den Videos machst, aber ich hoffe, du beachtest die AGB der Anbieter und etwaige Urheberrechte.
Geändert von onemorenerd (22-01-2009 um 21:43 Uhr)
|

22-01-2009, 21:58
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
OffTopic: Was hatte ich da heute morgen denn für eine Pain? Die Lösung mit dem Filehandle ist natürlich viel eleganter...
|

23-01-2009, 10:07
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
So, ich habe jetzt wget für mich entdeckt. Geht unproblematischer, weil keine Allocation-Fehler kommen und das wget richtig flott runterlädt :-)
|

24-01-2009, 16:58
|
|
strauberry
Registrierter Benutzer
|
|
Registriert seit: Nov 2002
Beiträge: 616
|
|
Hier noch ein weiterer Tipp: es kann sein, dass bei großen Downloads ein 500er erscheint, der Download aber trotzdem weiterläuft. Der 500er wird vom Apache geschickt, um Zombie Prozesse zu verhindern. Es muss also in regelmäßigen Abständen ein Output an den Browser geschickt werden. Bsp siehe hier: http://de2.php.net/set_time_limit -> Hoorn
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|