PHP Streaming

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

  • PHP Streaming

    Grundlage ist mittels PHP binäre Daten (Videos) in beliebig grossen Teilen zu parsen und dann an den Client zu senden.
    Der Prozess bedient sich der Funktionen fopen, fseek, print, fclose. Auf was gilt es denn zu achten im Falle von grossen Dateien (150mb>) zu achten
    und in welchem zusammenhang steht das mit dem memory_limit, output_buffering, max_execution_time, implicit_flush etc ?

    Mir ist unklar an welchen Stellen des Prozesses Zwischenspeicherungen bzw. Weiterleitungen entstehen bzw. wann eine Garbage Collection stattfindet.
    Binäre Daten werden eingelesen via PHP. Wird die Abarbeitung des ganzen File im Modul abgewartet bis der Output an den jeweiligen HTTP-Server (Apache) weitergeleitet wird und dieser die Daten dann ausliefert ?

    Oder ist diese Technik überhaupt nicht ratsam ?

    Das Ziel besteht vereinfacht darin einen geeigneten Streamingserver (Real/Windows/FlashMedia) zu umgehen, um einerseits die Verbindung zwischen Usermanagement und Zugriffsrechten zu erleichtern und andererseits kostenintensive Lizenzen zu umgehen. Hinzu kommt natürlich auch die Bandbreitenkalkulation, die bei non-progessiven (PHP-)Streams erheblich ins Gewicht fallen.

    Die Schlüsselfrage ist eigentlich, ob man das o.g. Szenario einem "herkömmlich" konfigurierten Server zumuten kann (wobei ich jetzt mal die Cluster-Architektur ausser acht lasse) , welche PHP-seitgen konfigurationen ins Gewicht fallen und Flaschenhälse auf die es bei einer klassischen LAMP-Konfiguration zu achten gilt.

    Vielen Dank für Eure Hilfe,

    David

  • #2
    Bei 150 MB und mehr bist du gezwungen, die Datei häppchenweise zu lesen und an den Client zu senden. Es wäre tödlich, erstmal alles in den RAM zu laden ($var = file(..)), das ist klar.

    Wie groß ein Häppchen sein sollte, hängt ganz von der Art der Datei ab. Das memory_limit sollte dem größten möglichen Häppchen plus X für den Rest des Scripts nicht unterschreiten. Auch klar.
    Speicherbedarf im worst case: "Anzahl paralleler Streams * memory_limit" Bytes - also auch die Anzahl der Streams begrenzen.

    Der Webserver sollte alles was er vom Script bekommt sofort senden, um einen flüssigen Stream hinzubekommen. Das geht entweder per implicit_flush = on oder mit explizitem flush() nach jeder Ausgabe eines Häppchens.

    Denk auch an die max_execution_time!

    Garbage Collection findet in deinem Fall nicht statt (gibt es in PHP imho nur für Session-Files). Der belegte Speicher ist sofort wieder frei, wenn das Script beendet wird.

    Ich hoffe, das hilft erstmal.


    PHP ist für Streaming natürlich denkbar ungeeignet. Das weißt du hoffentlich. Ein eigener Deamon an einem bestimmten Port wäre besser. Sozusagen ein selbstgestrickter Streaminserver. Damit sparst du dir den Overhead eines Webservers, der jeden Request erstmal analysiert, evlt. umschreibt, seine ht-Regeln anwedet, den PHP-Interpreter startet, Logfiles führt ...
    So einen Deamon könnte man sogar auch in PHP schreiben. Aber die Prozesskontrollfunktionen in PHP sind sehr dürftig und es ist und bleibt eben eine interpretierte Sprache.

    Kommentar


    • #3
      Vielen Dank für die ausführliche Erklärung. Vielleicht war der Ausdruck "Streaming" etwas fremdleitend. Es ist nicht so, dass eine stete Verbindung ähnlich einem Socket besteht. Primär geht es darum binäre Daten via PHP einzulesen und eine bestimmte Menge an Bytes an den HTTP-Server zur Ausgabe weiterzuleiten.

      Einen dedizierten Daemon zu schreiben ist aber eine super Idee!


      Vielen Dank nochmal,

      David Fischer

      Kommentar


      • #4
        leidensgenosse

        Hi David!
        Ich habe soeben zufällig deinen Post hier gelesen und musste feststellen, dass ich mich momentan exakt mit den gleichen Fragen und Problemen rumschlage. Mich würde interessieren, ob Du in der Sache schon weitergekommen bist bzw. ne akzeptable Lösung gefunden hast.
        Würde mich über einen Erfahrungsaustausch sehr freuen.

        Gruß aus Köln,
        Simon

        Kommentar

        Lädt...
        X