Jan: genauen Download-Traffic messen

Hy @ all,
Ich wollt fragen ob mir irgendeiner von euch Profis mir weiterhelfen kann. Ich biete auf meiner Seite Downloads von größeren Dateien an, nur leider hab ich das Problem, dass ich so wie ich es jetzt mache immer nur die gesamten Downloads vom Traffic-Limit abziehe, will heissen wenn er eine datei auch nur anfängt werden sofort 260 MB vom Traffic abgezogen, ob er nun aufhört oder nicht. Ich hab es schon auf einer anderen Homepage gesehen, dass mittels php dieser Traffic LIVE gemessen und direkt abgezogen wurde. Es wäre nett, wenn mir irgendjemand helfen könnte.
Gruß:
Jan

  1. Hi Jan,

    Diskussionen zu deiner Frage dürften sich mittlerweile auch schon oft genug im Archiv finden...

    Ich hab es schon auf einer anderen Homepage gesehen, dass mittels php dieser Traffic LIVE gemessen und direkt abgezogen wurde. Es wäre nett, wenn mir irgendjemand helfen könnte.

    Hast du schon mal probiert, die Download-Daten mit einem PHP-Script blockweise auszugeben und zwischendurch mit connection_aborted() zu prüfen, ob die Verbindung schon vom Client beendet wurde?

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Patch zur Verwendung von PATHINFO in JLog
    Das Denken ist zwar allen Menschen erlaubt, aber vielen bleibt es erspart. (Curt Goetz)
    1. Hi Jan,

      Diskussionen zu deiner Frage dürften sich mittlerweile auch schon oft genug im Archiv finden...

      Ich hab es schon auf einer anderen Homepage gesehen, dass mittels php dieser Traffic LIVE gemessen und direkt abgezogen wurde. Es wäre nett, wenn mir irgendjemand helfen könnte.

      Hast du schon mal probiert, die Download-Daten mit einem PHP-Script blockweise auszugeben und zwischendurch mit connection_aborted() zu prüfen, ob die Verbindung schon vom Client beendet wurde?

      MfG, Dennis.

      Moin Moin,
      Vielen Dank erstmal für all die Antworten (obwohl ich der Diskussion nicht ganz folgen konnte...).
      Ich hab schon mal ein wenig damit rumhantiert, weiss aber nicht wie ich das einsetzen soll das check_aborted()... Ich könnte es ja in eine while-schleife packen, dann würde doch aber auch das readfile immer wieder neu beginnen... sollte ich das mit readfile() machen oder lieber was anderes?
      Schönen Abend noch und LG von
      Jan

      1. Moi Moin,

        Ich hab schon mal ein wenig damit rumhantiert, weiss aber nicht wie ich das einsetzen soll das check_aborted()...

        Stop! Die Funktion check_aborted() gibt es nicht. Programmierung verlangt von Dir nunmal auch ein Mindestmaß an Disziplin und Genauigkeit.

        Ich könnte es ja in eine while-schleife packen, dann würde doch aber auch das readfile immer wieder neu beginnen... sollte ich das mit readfile() machen oder lieber was anderes?

        Die Funktion readfile() ist für Deine Zwecke absolut ungeeignet, denn sie liest ohne Unterbrechung aus einer Datei in den Ausgabepuffer. Dir worde auch nicht zu readfile() angeraten, es kam bei der Diskussion herraus, daß fread() für Dich die geeigneteste Funktion ist - nutze diese!

        Gruß aus Berlin!
        eddi

  2. Tach...

    Ich habe schon eine Weile nichts mehr mit PHP gemacht. Daher weis ich nicht, ob die hier was nützen könnten http://php.net/manual/en/ref.stream.php. Ich habe das nie gebraucht, aber zumindest steht da was von "STREAM_NOTIFY_PROGRESS  Indicates current progress of the stream transfer in bytes_transferred and possibly bytes_max as well."

    Wenn es geht, dann schreib mal wieder - würde mich auch interessieren.

  3. Hallo,

    lasse alle Datein von einem Script ausgeben. Das Script liest dabei in einer Schleife aus der gewünschten Datei und mit fgets() und prüft die Länge des ausgelesenen Strings mit strlen() und prüft dann, wie Dennis es vorgeschlagen hatte, mit connection_aborted() auf Verbindungsabbrüche:

    [link:http://de3.php.net/manual/de/language.control-structures.php#control-structures.if@title=if]([link:http://de3.php.net/manual/de/function.file-exists.php@title=file_exists]('./'.$_GET['download_datei_name'])){  
            $dat=[link:http://de3.php.net/manual/de/function.fopen.php@title=fopen]($_GET['download_datei_name'],'r');  
            $siz=0;  
            [link:http://de3.php.net/manual/de/control-structures.while.php@title=while](![link:http://de3.php.net/manual/de/function.feof.php@title=feof]($dat) && ![link:http://de3.php.net/manual/de/function.connection-aborted.php@title=connection_aborted]()){  
                    $t=[link:http://de3.php.net/manual/de/function.fgets.php@title=fgets]($dat);  
                    $siz+=[link:http://de3.php.net/manual/de/function.strlen.php@title=strlen]($t);  
                    echo $t;  
            }  
            [link:http://de3.php.net/manual/de/function.fclose.php@title=fclose]($dat);  
            log_dl_size($siz);  
    }  
    else    poeble_den_besucher_an();
    

    Gruß aus Berlin!
    eddi

    1. Hi,

      $t=fgets($dat);

      hier dürfte fread wohl angebrachter sein, oder?

      freundliche Grüße
      Ingo

      1. Hallo,

        $t=fgets($dat);
        hier dürfte fread wohl angebrachter sein, oder?

        warum?

        Gruß aus Berlin!
        eddi

        1. Hi eddi,

          $t=fgets($dat);
          hier dürfte fread wohl angebrachter sein, oder?

          Bis zu einem Zeilenende könnte ziemlich lang sein, eventuell zu lang, eventuell auch zu klein (wenn z.B. ein Leerzeile). Mit fread() könnte man Blöcke fester Länge auslesen und an den Client weiterreichen.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Patch zur Verwendung von PATHINFO in JLog
          "Funktioniert nicht" hat exakt den selben Aussagewert wie "husseldiguggeldu" (Cheatah)
          1. Hallo,

            Bis zu einem Zeilenende könnte ziemlich lang sein, eventuell zu lang,

            was soll an maximal 1024 Byte zu lang sein?

            eventuell auch zu klein (wenn z.B. ein Leerzeile).

            Was wäre daran schlimm, wenn immer wieder nur einzelne Zeichen ausgegeben werden?

            Mit fread() könnte man Blöcke fester Länge auslesen und an den Client weiterreichen.

            Das wäre nur in dem Fall interessant, wenn man mit dem Webserver eine feste Größe aushandeln könnte, die dann als solche Stücke ungepuffert ausgegeben werden würden.

            Gruß aus Berlin!
            eddi

            1. Hi eddi,

              Was wäre daran schlimm, wenn immer wieder nur einzelne Zeichen ausgegeben werden?

              Es entstünde vielleicht eine höhere Belastung des Servers, weil ständig mit connection_aborted() geprüft werden muss - ich weiß ja nicht, was PHP da intern macht.

              Mit fread() könnte man Blöcke fester Länge auslesen und an den Client weiterreichen.

              Das wäre nur in dem Fall interessant, wenn man mit dem Webserver eine feste Größe aushandeln könnte, die dann als solche Stücke ungepuffert ausgegeben werden würden.

              Dies ließe sich ja eventuell mit flush() erreichen...

              MfG, Dennis.

              --
              Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
              Patch zur Verwendung von PATHINFO in JLog
              Der erste Schweizer ist entstanden, als ein Russe versucht hat holländisch zu sprechen. (Thomas Gottschalk)
              1. Hallo,

                Was wäre daran schlimm, wenn immer wieder nur einzelne Zeichen ausgegeben werden?

                Es entstünde vielleicht eine höhere Belastung des Servers, weil ständig mit connection_aborted() geprüft werden muss - ich weiß ja nicht, was PHP da intern macht.

                1:1 :þ (daran habe ich nicht mehr gedacht, stimmt)

                ...ungepuffert...

                Dies ließe sich ja eventuell mit flush() erreichen...

                Gelbe Karte ;)

                Gruß aus Berlin!
                eddi

        2. Hi,

          $t=fgets($dat);
          hier dürfte fread wohl angebrachter sein, oder?

          warum?

          außer den drei Anmerkungen im Manual zu fgets handelt es sich hier wohl kaum um Textdateien, so dass Zeilenumbüche irrelevant sind.

          freundliche Grüße
          Ingo

          1. Hallo,

            außer den drei Anmerkungen im Manual zu fgets handelt es sich hier wohl kaum um Textdateien, so dass Zeilenumbüche irrelevant sind.

            die Anmerkungen kenne ich und ich werde hier auch weiterhin nicht für Uraltversionen PHPs coden. Die Funktion ist binär sicher und was Zeilenumbrüche betrifft, so verstehe ich nicht, wo dies ein Problem darstellt. Deine Andeutung ist nach wie vor für mich nicht nachvollziehbar und ich muß erneut fragen: Warum?

            Gruß aus Berlin!
            eddi

            1. Hi,

              was Zeilenumbrüche betrifft, so verstehe ich nicht, wo dies ein Problem darstellt. Deine Andeutung ist nach wie vor für mich nicht nachvollziehbar und ich muß erneut fragen: Warum?

              weil wie ich schrieb die Zeilenumbrüche keinerlei Relevanz haben. Warum dann überhaupt eine Funktion nehmen, die diese berücksichtigt, wenn es doch eine andere gibt, mit der Blöcke optimal anzugebender Länge übertragen werden können (und nebenbei die Abfrage der Stringlänge entbehrlich wird)?

              freundliche Grüße
              Ingo