2010-02-24 6 views
6

Ich habe eine Datei-Hosting-Site und Benutzer verdienen eine Belohnung für Downloads. Ich wollte also wissen, ob ich nachvollziehen kann, ob der Besucher die gesamte Datei heruntergeladen hat, so dass es keine gefälschten Teildownloads gibt, nur um Belohnungen zu erhalten.Tracking-Datei vollständigen Download

Vielen Dank.

+0

Wie sollen diese Dateien groß sein? Kb? Mb? <100 Mb? – Strae

+0

DK-Wamp sagte "Kann ich weitere Details zu diesem Thema haben? // Ich habe versucht, dieses Skript zu verwenden, aber nicht für mich funktioniert. :(// Ich weiß, dass ist ein altes Thema, aber ich hoffe finden Sie eine Lösung. " – Veedrac

Antwort

1

Wenn Sie die von Ihrem Webserver zurückgegebenen HTTP-Antwortcodes überwachen und sie an die Sitzungen binden könnten, die sie generiert haben, wären Sie im Geschäft.

Ein Antwortcode von 206 zeigt, dass das System einige der Informationen, aber nicht alle davon geliefert hat. Wenn der letzte Teil der Datei gelöscht wird, sollte er keinen Antwortcode von 206 haben.

Wenn Sie dies an Benutzersitzungen binden können, indem Sie den Sitzungscode in die URL einfügen, können Sie Punkte basierend auf einem einfachen geben Protokollaggregation

+0

Können Sie mir bitte ein Beispiel für seine Verwendung zeigen? – Shishant

+0

Ich habe keine Apache Logs zur Hand. Hast du zufällig einen Ausschnitt aus einer Dateiübertragung aus deinen Logs, den du posten kannst? Filtern Sie es nach einer Datei und einer IP-Adresse, um nur die relevanten Einträge zu erhalten. Abhängig von Ihrem Protokollformat sollte es relativ einfach sein, den Eintrag zu finden, der die letzte Seite der Datei ist. – TheJacobTaylor

1

Ich habe eine ähnliche Lösung auf einer Datei-Hosting-Website implementiert.

Was Sie tun möchten, ist die Verwendung des Callbacks register_shutdown_function, mit dem Sie das Ende der Ausführung eines PHP-Skripts unabhängig vom Ergebnis erkennen können.

Dann möchten Sie Ihre Datei in einem nicht-Web zugänglichen Ort auf Ihrem Server (n) haben, und Ihre Downloads gehen durch php: Idee, dass Sie in der Lage sein zu verfolgen, wie viele Bytes wurden übergeben der Kunde.

Hier ist eine grundlegende Art und Weise der Umsetzung (zB :)

<?php 
register_shutdown_function('shutdown', $args); 

$file_name = 'file.ext'; 
$path_to_file = '/path/to/file'; 
$stat = @stat($path_to_file); 

//Set headers 
header('Content-Type: application/octet-stream'); 
header('Content-Length: '.$stat['size']); 
header('Connection: close'); 
header('Content-disposition: attachment; filename='.$file_name); 

//Get pointer to file 
$fp = fopen('/path/to/file', 'rb'); 
fpassthru($fp); 

function shutdown() { 
    $status = connection_status(); 

    //A connection status of 0 indicates no premature end of script 
    if($status == 0){ 
    //Do whatever to increment the counter for the file. 
    } 
} 
>? 

Es gibt offensichtlich Möglichkeiten zu verbessern, so dass, wenn Sie weitere Informationen oder ein anderes Verhalten benötigen, lassen Sie es mich wissen!

+1

Das wird Apache mit großen Dateien töten ... – Strae

+0

Ja, Sie haben Recht, es hängt stark von der Nutzung der Website ab.Auf unserer Anwendung haben wir alle Datei-Downloads über php geleitet, weil wir uns auch authentifiziert haben Der Punkt ist, dass wir dedizierte Server für die Bereitstellung dieser Dateien hatten, die Backend-Speicherserver mit Lighttpd speisten. Wir hatten den Footprint von Apache reduziert, indem wir alle außer den essentiellen Modulen kompilierten und deaktivierten etwa 130 gleichzeitige Downloads/Server über 35 Frontends, für einen Gesamtdurchsatz von 2 .3Gbps ... –