2010-02-24 2 views
6

Ho un sito di hosting di file e gli utenti guadagnano una ricompensa per i download. Quindi volevo sapere se c'è un modo per sapere se il visitatore ha scaricato tutto il file in modo che non ci siano download parziali falsi solo per i premi.Download completo del file di tracciamento

Grazie.

+0

Come si suppone che quei file siano grandi? Kb? Mb? <100 Mb? – Strae

+0

DK-Wamp ha detto "Posso avere altri dettagli su questo argomento? // Ho provato a utilizzare questo script ma non ha funzionato per me. :(// So che è un argomento vecchio ma spero di trovare una soluzione. " – Veedrac

risposta

1

Se fosse possibile monitorare i codici di risposta HTTP restituiti dal server Web e collegarli alle sessioni che li hanno generati, si sarebbe in attività.

Un codice di risposta di 206 indica che il sistema ha fornito alcune informazioni ma non tutte. Quando il blocco finale del file si spegne, non dovrebbe avere un codice di risposta di 206.

Se è possibile legare questo alle sessioni utente inserendo il codice di sessione all'interno dell'URL, è possibile fornire punti basati su un semplice aggregazione di log.

+0

Puoi per favore mostrarmi qualche esempio del suo utilizzo? – Shishant

+0

Non ho pratici i log di Apache. Ti capita di avere uno snippet di un trasferimento di file dai tuoi registri che puoi pubblicare? Filtralo per un file e un indirizzo IP per ottenere solo le voci pertinenti. A seconda del tuo formato di registro, dovrebbe essere relativamente facile trovare la voce che è l'ultima pagina del file. – TheJacobTaylor

1

Ho implementato una soluzione simile su un sito Web di hosting di file.

Quello che vuoi fare è usare il callback register_shutdown_function che ti permette di rilevare la fine dell'esecuzione di uno script php indipendentemente dal risultato.

Quindi vuoi avere il tuo file in una posizione non accessibile sul web sul tuo server (s), e i tuoi download passano attraverso php: idea è che si vuole essere in grado di tenere traccia di quanti byte sono stati passati a il cliente.

Ecco un modo semplice di attuazione (ad esempio :)

<?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. 
    } 
} 
>? 

Ci sono ovviamente modi per migliorare, quindi se avete bisogno di maggiori dettagli o un altro comportamento, fatemelo sapere!

+1

Questo ucciderà apache con file di grandi dimensioni ... – Strae

+0

Sì, hai ragione, dipende molto dall'utilizzo del sito. Sulla nostra applicazione abbiamo usato per convogliare tutti i download di file tramite php perché abbiamo usato anche per autenticare l'utente ha limitato la larghezza di banda, puntando sul fatto che disponevamo di server dedicati per servire quei file, alimentando i server di back-end con lighttpd. Abbiamo ridotto l'ingombro di Apache compilando e disabilitando tutti i moduli essenziali tranne quelli essenziali. circa 130 download simultanei/server su 35 front-end, per un throughput totale di 2 .3Gbps ... –