file_put_contents und resume

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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

  • #2
    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...

    Kommentar


    • #3
      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!

      Kommentar


      • #4
        Ah ok, dann will ich nichts gesagt haben. Aber du sprichst doch von Download, wieso dann file_put_contents?

        Kommentar


        • #5
          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.

          Kommentar


          • #6
            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.

            Kommentar


            • #7
              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 :-)

              Kommentar


              • #8
                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.

                Kommentar


                • #9
                  Alles klar, danke!

                  Hab in den Kommentaren auch was interessantes gefunden:

                  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?

                  Kommentar


                  • #10
                    Mit stream_get_contents habe ich leider den gleichen Effekt
                    Aber auch nur bei youtube. Clipfish, myVideo und andere funktionieren wunderbar...

                    Kommentar


                    • #11
                      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.
                      Zuletzt geändert von onemorenerd; 22.01.2009, 21:43.

                      Kommentar


                      • #12
                        OffTopic:
                        Was hatte ich da heute morgen denn für eine Pain? Die Lösung mit dem Filehandle ist natürlich viel eleganter...

                        Kommentar


                        • #13
                          So, ich habe jetzt wget für mich entdeckt. Geht unproblematischer, weil keine Allocation-Fehler kommen und das wget richtig flott runterlädt :-)

                          Kommentar


                          • #14
                            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

                            Kommentar

                            Lädt...
                            X