download-counter statt klick-counter

  • nachfolgende funktion sollte mir eigentlich downloads zählen, sie zählt stattdessen die klicks...
    jemand ne idee für abhilfe?
    die module mod_gzip und mod_deflate kann ich leider nicht individuell deaktivieren, die sind beide aktiv.


  • Die Zählung wird ja offenbar durch das Setzen der Variable $intDowns ermöglicht. Dort steht scheinbar ja schon der zu speichernde Zähler drinne, was ungenau ist wenn z.B. mehrere Leute gleichzeitig die URL aufrufen.

    Ich würde empfehlen auf diese Variable zu verzichten und statt dessen diesen Teil hier zu ändern:

    PHP
    $sql = "update download set downloads = downloads + 1 where name = '".$arrDownloads[$key]['name']."'";
  • ob ich im sql-statement das teil inkrementiere oder direkt vorm aufruf der make-download is ja fast schon egal, da der zeitraum einfach arg klein ist.
    aber auch das wäre ein "offset" mit dem ich leben könnte, wenn denn der download und nicht der klick gezählt würde..

  • Hmm, so ganz verstehe ich das Problem nicht, diese Funktion wird doch nur aufgerufen, wenn ein Download gestartet wird, oder nicht? Wo ist dann der Unterschied zwischen einem Klick auf den Downloadlink oder dem eigentlichen Download?

  • Dann verstehe ich nicht was Du mit Klick meinst. Die URL zum Download wird ja aufgerufen durch Klick auf einen Link. Das heißt auch, dass die Datei zum Download dem Nutzer angeboten wird - und in dem Moment wird auch schon der Zähler hoch gesetzt. Das ist schon genau das was dieses Script macht, und hat imho nichts mit dem Klick selbst zu tun sondern eben mit dem Moment der Speicherung.

    Willst Du also eher speichern, ob ein Download erfolgreich durchgeführt wurde?

  • ja thredai, richtig erfasst, ich will die erfolgreichen download zählen :)
    und ja bandit du hast ja recht, aber wenn jemand 20 mal klickt und 19 probleme hat die file erfolgreich zu bekommen hab ich 20 hits aber nur einen download effizient

  • Und wenn du die IPs der downloader für, sagen wir mal 24h, speicherst? Wenn ich dann versuche das File runterzuladen aber 20 Anläufe brauch, zählt ers nur einmal. Und du hast sogar den vorteil dass wenn ichs mehrmals am Tag lade, der counter trotzdem nich weiter geht, als er sollte.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Eine präzise Zählung wirst du so oder so nicht hinbekommen. Klar, die Sache mit der IP wäre möglich, aber garantiert dir auch keine Genauigkeit. Denn was ist, wenn mehrere User hinter einem Router sitzen, z.B. in Firmen. ;)

  • Nein, dafür müsste man eine Ebene höher ansetzen. Ein Request an einen Server wird immer vom Webserver abgefangen und auch protokolliert. Wenn man eine Webseite aufruft gibt es folglich einen Request an den Server und auch einen Logeintrag der die aufgerufene URL, Uhrzeit, ggfs. auch noch die (anonymisierte) IP, die übertragene Datenmenge und das Ergebnis des Requests enthält. Und gerade letztere beide Daten sind das was dich interessiert.

    Ich habe mich eben mal auf die Suche gemacht und hier 2 Möglichkeiten gefunden.

    Möglichkeit a)
    Basiert auf dem Fakt, dass eine Datei vom Server nur gelöscht werden kann, wenn kein Prozess mehr darauf zugreift. D.h. solange der Apache auf die Datei zugreift um sie per Download auszugeben, solange liegt sie auch unlöschbar auf dem Server. Wenn man den Gedanken weiterführt, kann man ja alle X Sekunden prüfen, ob die Datei gelöscht werden kann. Wenn sie nicht gelöscht werden kann, dann wird noch auf sie zugegriffen/runtergeladen. Wenn sie gelöscht werden kann, dann wurde sie runtergeladen - und in deinem Fall könntest Du dann den Counter hochsetzen.

    Möglichkeit b)
    Das selbe wie a), nur das man über die Apache-eigene SetEnv-Funktion prüft, ob eine Datei runtergeladen wurde - und wenn ja wird sie gelöscht. Das könnte man in einer Programmierung nun wiederum z.B. mit file_exists() prüfen, und wenn die Datei nicht mehr existiert kannst Du den Counter hochsetzen.

    Das klingt sicher für dich erstmal kompliziert, vor allem weil du eigentlich keine Dateien löschen willst. Dazu hätte ich aber folgenden Vorschlag:
    Bau für jeder runterzuladende Datei einen Link mit Parameter zusammen, z.B. download.php?file=filename.zip. Das download.php-Script liefert dann die Datei zum Download aus. Am Ende des Scripts, nach der Ausgabe des Codes der runterzuladenden Datei, prüfst Du dann in einer Schleife, ob die Datei gelöscht werden kann. Wenn ja, setzt Du den Counter hoch.

    Habe so etwas nie gemacht und finde auch den Aufwand dafür etwas groß. Eine 100%ige Sicherheit, dass eine Datei komplett runtergeladen wurde kann es ohne einen speziell programmierten Download-Manager (Client-Server-Kommunikation während Download, so wie es z.B. der Flash-Updater macht) aber nicht geben.

  • threadi, genau das mit der kommunikation hab ich mir leider auch schon gedacht, hatte mal davon gehört, dass php6 sowas können will/soll, aber das projekt php6 wurde ja bereits eingestampft und wird nicht released.
    also wäre die vorgehensweise eine temporäre datei zu erstellen und die "nach download" wieder zu löschen.. ok
    is halt die frage, wieviel serverlast das produziert, wenn ich dateien von 150 bis 300MB öfter mal als temp anlege :)
    aber ne idee isses schon :) danke!!
    ich lass mir das mal durch den kopf gehen.

  • Und was ist damit?

    PHP
    $fp=@fopen($file, "r");
    while (connection_aborted()==0 && !feof($fp)) {
        echo fread($fp, 1000000);
    }
    if (!feof($fp)) { // Schleife wurde abgebrochen, download nicht fertig
    }
    @fclose($fp);

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • tobse, hast du mal meinen code angesehen??

    und die tempfile klappt auch nich.
    mod_deflate bekommt den request und schickt intern dem apachen die info. hol file xy und komprimier die, danach schick die an user x
    das heisst ich kann da gar nix machen, denn der user-request is schon abgefertigt, wenn der apache die file an user x schickt.
    ich mach quasi ne temp-kopie schick dann das mod_deflate drüber (deaktivieren geht laut meines hosters nich) und das mod_deflate macht mir ne kopie meiner kopie und schickt die dann raus. egal was ich mach mit mod_deflate kann man keine downloads zählen

  • Ja, hab ich. Dein code verwendet connection_aborted() nicht. Wenn die Funktion so funktioniert, wie sie soll, wird doch damit die Datei nur solange ausgelesen wie eine verbindung besteht.
    Wenn nach der schleife das file nocht nicht ganz gelesen ist, muss die Schleife wegen der Verbindung abgebrichen sein - oder nicht?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!