php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 22-01-2009, 09:09
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 22-01-2009, 10:20
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

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...
Mit Zitat antworten
  #3 (permalink)  
Alt 22-01-2009, 10:23
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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!
Mit Zitat antworten
  #4 (permalink)  
Alt 22-01-2009, 10:25
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ah ok, dann will ich nichts gesagt haben. Aber du sprichst doch von Download, wieso dann file_put_contents?
Mit Zitat antworten
  #5 (permalink)  
Alt 22-01-2009, 10:28
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #6 (permalink)  
Alt 22-01-2009, 11:16
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt 22-01-2009, 11:23
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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 :-)
Mit Zitat antworten
  #8 (permalink)  
Alt 22-01-2009, 11:40
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #9 (permalink)  
Alt 22-01-2009, 11:48
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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?
Mit Zitat antworten
  #10 (permalink)  
Alt 22-01-2009, 18:33
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mit stream_get_contents habe ich leider den gleichen Effekt
Aber auch nur bei youtube. Clipfish, myVideo und andere funktionieren wunderbar...
Mit Zitat antworten
  #11 (permalink)  
Alt 22-01-2009, 21:40
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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)
Mit Zitat antworten
  #12 (permalink)  
Alt 22-01-2009, 21:58
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

OffTopic:
Was hatte ich da heute morgen denn für eine Pain? Die Lösung mit dem Filehandle ist natürlich viel eleganter...
Mit Zitat antworten
  #13 (permalink)  
Alt 23-01-2009, 10:07
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So, ich habe jetzt wget für mich entdeckt. Geht unproblematischer, weil keine Allocation-Fehler kommen und das wget richtig flott runterlädt :-)
Mit Zitat antworten
  #14 (permalink)  
Alt 24-01-2009, 16:58
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:00 Uhr.