Dal momento che hai detto che siete su Apache, qui ci sono 2 idee.
prima idea (l'idea così così, ma divertente pensare a ...):
I cookie vengono inviati con ogni richiesta sul server (tra cui a tutte le immagini, ecc). Quando l'utente effettua il login, imposta un cookie con PHP e chiamalo USERTOKEN
quindi imposta il valore di esso su un md5 + salt dell'ID dell'utente.
Inserire %{USERTOKEN}C
e %B
in una direttiva personalizzata LogFormat
.
%{Foobar}C The contents of cookie Foobar in the request sent to the server.
Only version 0 cookies are fully supported.
%B Size of response in bytes, excluding HTTP headers.
Ora, si crea un formato log personalizzato che assomiglia a questo:
LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
Poi, si crea uno script per analizzare il php_bandwidth_log e la mappa per l'ID dell'utente originale.
Sfortunatamente questa idea non è infallibile poiché qualcuno potrebbe ancora ipoteticamente accedere ai contenuti del sito non passando un cookie (forse). In ogni caso, a seconda della situazione, questo potrebbe funzionare per te, in caso contrario, un'idea alternativa e migliore è quella di indirizzare fondamentalmente tutti i contenuti tramite script PHP in modo da poter eseguire qualsiasi tipo di registrazione su di esso.
seconda idea (meglio):
Quindi, creare un file PHP che può essere chiamato come questo /files.php?path=/blah/blah.jpg
(semplificato per questo esempio, potrebbe essere prettied con una regola mod_rewrite) poi all'interno di esso si si può registrare l'id dell'utente e tracciare i file a cui si accede. Questo presuppone che tu voglia solo monitorare i file. In questo modo non si terrà traccia dell'HTML generato nella pagina, probabilmente si potrebbe usare l'idea di registrazione Apache personalizzata menzionata in precedenza, ma modificarla un po 'per ottenere tali informazioni.
Ecco alcuni pseudo codice per ottenere l'idea:
if (!$hasSession) {
die("Invalid session");
}
$size = filesize($path);
insert_into_bandwidth_table($userId, $size);
header("Content-Type: ...");
readfile($path);
Il seguente è come è possibile monitorare solo la dimensione di risposta per gli script PHP eseguito ma funzionerà solo se si utilizza PHP come un modulo.
Nel tuo PHP aggiungi qualcosa come questo. Fondamentalmente questo permette ad Apache di leggere questa variabile per scritture di registro:
apache_note("PHP_USER_ID", 1234);
apache_note - apache_note - get e set richiesta apache note
Descrizione: Questa funzione è un wrapper per table_get e table_set di Apache. Modifica la tabella delle note che esiste durante una richiesta. Lo scopo della tabella è consentire ai moduli Apache di comunicare.
Read more here
Poi nella configurazione del registro httpd.conf fare qualcosa di simile:
LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
Informazioni sulla nota documenti:
%{Foobar}n The contents of note Foobar from another module.
E ... basta ho realizzato che esiste un'alternativa ad apache_note nel caso in cui non lo si esegua come modulo. Il vostro codice PHP sarebbe invece fare questo:
apache_setenv('PHP_USER_ID', $userId, TRUE);
Poi il login si può usare questa direttiva LogFormat:
LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log
è tutto sullo stesso server? – Clay
E quale server web stai usando? Apache? o un altro? – Clay
@Clayton scusa per la risposta in ritardo. Sì, tutto è sullo stesso server e utilizzerà Apache –