2016-01-01 28 views
6

OK Wiem, że to dziwny problem i może nie być to możliwe, więc pomysły zostaną docenione.Jak monitorować zużycie przepustowości użytkownika w PHP

W każdym razie chcę dowiedzieć się, ile przepustowości dam każdemu użytkownikowi. Identyfikuję użytkownika, gdy loguje się do witryny.

Więc w zasadzie dla każdego żądania, chcę wiedzieć, ile pasma zostało użyte przez to żądanie. A jeśli użytkownik był zalogowany w tym czasie, dodam kwotę do jego konta.

Będzie używał codeigniter, choć wątpię, żeby to miało znaczenie.

Wszystko będzie na tym samym serwerze opartym na systemie Linux z Apache, przynajmniej na razie.

Idealne rozwiązanie, które nie ogranicza się do typu hostingu.

Będzie używać usługi Google Cloud lub Amazon AWS. Jeśli rozwiązanie jest ograniczone do Google Cloud lub AWS, będzie działać.

+0

wszystko jest na tym samym serwerze? – Clay

+0

I na jakim serwerze WWW pracujesz? Apache? lub inny? – Clay

+0

@Clayton przepraszam za spóźnioną odpowiedź. Tak, wszystko jest na tym samym serwerze i będzie używane Apache –

Odpowiedz

2

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

Dzięki człowieku. To są wspaniałe pomysły! Niewielka eksploracja w tym kierunku może rozwiązać problem. Inny pomysł oparty na idei cookie. Wiemy, który użytkownik uzyskuje dostęp do strony internetowej, za pośrednictwem której IP w danej chwili.Możemy użyć tych informacji podczas analizowania pliku dziennika Apache (szerokość pasma drukowania użyta z IP w pliku dziennika). To rozwiązałoby problem pustego ciasteczka, ale sprawiłoby, że inne rzeczy byłyby bardziej złożone. –

+0

Jeśli miałeś pójść z drugim pomysłem, zrobiłem edycję tego, jak możesz rozmiar zlecenia dla samych skryptów PHP, które są wykonywane. Minusem jest to, że zmusi cię do użycia PHP jako modułu, który może nie być pożądany. Zrobiliśmy to w poprzedniej pracy i wszystko działało bez zarzutu. Dzięki temu + routing plików sprawi, że zawsze będziesz mieć identyfikator użytkownika. – Clay

+0

aha ... wygląda na to, że możesz użyć 'apache_setenv' zamiast' apache_note', co moim zdaniem pomija potrzebę PHP jako modułu. ponownie, apache_note/apache_setenv będzie mógł rejestrować rozmiar skryptów PHP uruchamianych w sesji, a nie żadnych zewnętrznych plików, które nie są skryptami PHP. – Clay

0

Możesz użyć interfejsu API Amazona, aby sprawdzić wykorzystanie przepustowości, zamiast przy użyciu logów. jak już powiedziałeś, że używasz s3 do zarządzania zasobami, będzie dobrze, jeśli utworzysz nowy pojemnik dla każdego użytkownika i sprawdzisz wykorzystanie przepustowości, a następnie ograniczysz konto, jeśli przekroczy on ten limit.

Source: 

Możliwe rozwiązanie:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

Nowe wiadro na zawsze użytkownika? Yeesh. AWS domyślnie limituje do 100 segmentów. – ceejayoz