2016-01-01 27 views
6

Ok, so che questo è un problema strano e potrebbe non essere possibile, quindi le idee sarebbero apprezzate.Come monitorare il consumo di larghezza di banda di un utente in PHP

In ogni caso, voglio scoprire quanta larghezza di banda offro a ciascun utente. Identifico un utente quando accede al sito web.

Quindi, sostanzialmente per ogni richiesta, desidero sapere quanta larghezza di banda è stata utilizzata da tale richiesta. E se un utente ha effettuato l'accesso in quel momento, aggiungerò l'importo al suo account.

Utilizzerà il codeigniter, anche se dubito che faccia la differenza.

Tutto sarà sullo stesso server basato su Linux con Apache, almeno per ora.

Idealmente mi piacerebbe una soluzione che non si limiti al tipo di hosting.

Utilizzerà Google cloud o Amazon AWS. Se la soluzione è limitata a google cloud o aws, funzionerà.

+0

è tutto sullo stesso server? – Clay

+0

E quale server web stai usando? Apache? o un altro? – Clay

+0

@Clayton scusa per la risposta in ritardo. Sì, tutto è sullo stesso server e utilizzerà Apache –

risposta

2

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 
+1

Grazie amico. Queste sono idee meravigliose! Una piccola esplorazione in questa direzione potrebbe risolvere il problema. Un'altra idea basata sull'idea del cookie. Sappiamo quale utente sta accedendo al sito web tramite quale IP a che ora.Possiamo utilizzare queste informazioni durante l'analisi del file di log di apache (larghezza di banda di stampa utilizzata con ip nel file di registro). Ciò risolverebbe il problema dei cookie vuoti, ma renderebbe le cose più complesse. –

+0

Se si andasse con la seconda idea, ho apportato una modifica per come è possibile la dimensione della richiesta solo per gli script PHP che vengono eseguiti. Il rovescio della medaglia è che ti costringerà a usare PHP come un modulo che potrebbe non essere desiderabile. Lo abbiamo fatto in un precedente lavoro e comunque ha funzionato bene. Quindi, + il routing dei file lo farebbe in modo da avere sempre l'id utente. – Clay

+0

aha ... sembra che tu possa usare 'apache_setenv' invece di' apache_note' che credo supererebbe la necessità di avere PHP come modulo. ancora, apache_note/apache_setenv sarà in grado di registrare la dimensione degli script PHP che vengono eseguiti all'interno della sessione, non tutti i file caricati esternamente che non sono script PHP. – Clay

0

È possibile utilizzare l'API di Amazon per controllare il consumo di banda, invece di utilizzando i registri. come hai detto che stai usando s3 per gestire le risorse , sarà buono se crei un nuovo bucket per ogni utente e controlli l'utilizzo della larghezza di banda e quindi limiti l'account se lui/lei supera tale limite.

Source: 

Soluzione possibile

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

Un nuovo secchio per sempre utente? Yeesh. AWS ti limita a 100 secchi per impostazione predefinita. – ceejayoz