Ponieważ powiedziałeś, że są na Apache, tutaj są 2 pomysły.
Pierwszy pomysł (tak więc pomysł, ale zabawa o tym myśleć ...):
Cookies są wysyłane z każdego żądania na serwerze (w tym do wszystkich obrazów itp.) Gdy użytkownik zarejestruje zestaw plików cookie z PHP i nadadzą mu nazwę USERTOKEN
, ustaw jego wartość na sól md5 + identyfikatora tego użytkownika.
Wstaw %{USERTOKEN}C
i %B
do niestandardowej dyrektywy 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.
Teraz można utworzyć niestandardowy format dziennika, który wygląda tak:
LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
Następnie należy utworzyć skrypt do analizowania z php_bandwidth_log i mapę do ID użytkownika początkowego.
Niestety, ten pomysł nie jest niezawodny, ponieważ ktoś może nadal hipotetycznie uzyskiwać dostęp do zawartości strony, nie przekazując pliku cookie (być może). W każdym razie, w zależności od twojej sytuacji, to może ci pomóc, jeśli nie, alternatywnym i lepszym pomysłem jest zasadniczo przekierowanie całej zawartości za pomocą skryptu PHP, abyś mógł wykonać na niej dowolne logowanie.
Drugi pomysł (lepiej):
więc utworzyć plik PHP, który można nazwać tak /files.php?path=/blah/blah.jpg
(uproszczony dla tego przykładu może być prettied z reguły mod_rewrite), a następnie w jej wnętrzu ty ci może rejestrować identyfikator tego użytkownika i śledzić dostępne pliki. Zakłada to, że chcesz tylko śledzić pliki. Nie śledziłoby to HTMLa wygenerowanego na stronie - prawdopodobnie można użyć wspomnianego wcześniej pomysłu logowania Apache, ale trochę go zmodyfikować, aby uzyskać te informacje.
Oto niektóre pseudo kod, aby pomóc Ci się pomysł:
if (!$hasSession) {
die("Invalid session");
}
$size = filesize($path);
insert_into_bandwidth_table($userId, $size);
header("Content-Type: ...");
readfile($path);
Poniższy sposób można śledzić tylko wielkość odpowiedzi dla realizowanych skryptów PHP, ale to będzie działać tylko jeśli używasz PHP jako moduł.
W swoim PHP dodaj coś takiego. Zasadniczo pozwala Apache przeczytać tę zmienną do pisania dziennika:
apache_note("PHP_USER_ID", 1234);
apache_note - apache_note - Pobierz i ustawić żądanie apache zauważa
Opis: Funkcja ta jest opakowaniem dla table_get i table_set Apache. Edytuje tabelę notatek, która istnieje podczas żądania. Celem tabeli jest umożliwienie komunikacji modułów Apache.
Read more here
Następnie w konfiguracji dziennika httpd.conf zrobić coś takiego:
LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
informacji na temat notatki z dokumentów:
%{Foobar}n The contents of note Foobar from another module.
I ... po prostu zdałem sobie sprawę, że istnieje alternatywa dla apache_note na wypadek, gdybyś nie uruchamiał go jako modułu. Twój kod PHP byłoby zamiast zrobić:
apache_setenv('PHP_USER_ID', $userId, TRUE);
Następnie zalogować byłoby użyć tej dyrektywy LogFormat:
LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log
wszystko jest na tym samym serwerze? – Clay
I na jakim serwerze WWW pracujesz? Apache? lub inny? – Clay
@Clayton przepraszam za spóźnioną odpowiedź. Tak, wszystko jest na tym samym serwerze i będzie używane Apache –