Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inne][PHP]Pobieranie danych z pliku tekstowego i filtrowanie ich
lekosm2
post 9.10.2015, 07:42:23
Post #1





Grupa: Zarejestrowani
Postów: 141
Pomógł: 0
Dołączył: 9.10.2015

Ostrzeżenie: (0%)
-----


Witam. Chciałbym zrobić skrypt, który będzie zliczał ilość spędzonych /minut/godzin na serwerze. Jedyny sposób jaki mi przychodzi do głowy to pobieranie tej informacji z logów gdzie m.in. zapisuje się czas kiedy użytkownik wszedł na serwer i kiedy z niego wyszedł.
Logi wejścia/wyjścia z serwera są zapisywane w pliku z rozszerzeniem .log i wyglądają tak:
Kod
5-10-09 06:23:30.163577|INFO    |VirtualServerBase|  1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
2015-10-09 06:23:33.997875|INFO    |VirtualServerBase|  1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105
2015-10-09 06:23:41.896634|INFO    |VirtualServerBase|  1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
2015-10-09 06:23:43.042064|INFO    |VirtualServerBase|  1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105

Ma ktoś jakiś pomysł co dalej z tym zrobić? W jaki sposób mam wykonać? ohno-smiley.gif

Ten post edytował lekosm2 9.10.2015, 07:45:26
Go to the top of the page
+Quote Post
KsaR
post 9.10.2015, 08:18:44
Post #2





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Dobra, zrobienie tego jest banalne akurat, gorzej z wytłumaczeniem więc dam gotowca.
Ale w zamian za zadanie masz poczytać w manualu o każdej z użytych funkcji wink.gif

  1. <?php
  2. date_default_timezone_set('Europe/Warsaw'); # na "localhost" mi coś wariowało bez biggrin.gif
  3.  
  4. $TWOJ_LOG="5-10-09 06:23:30.163577|INFO |VirtualServerBase| 1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
  5. 2015-10-09 06:23:33.997875|INFO |VirtualServerBase| 1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105
  6. 2015-10-09 06:23:41.896634|INFO |VirtualServerBase| 1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
  7. 2015-10-09 06:23:43.042064|INFO |VirtualServerBase| 1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105";
  8.  
  9. preg_match_all('#\d{4}\-\d{2}-\d{2} \d{2}:\d{2}:\d{2}#', $TWOJ_LOG, $result);
  10.  
  11. /**
  12. * Funkcja z komentarzy :)
  13. * <a href="http://php.net/manual/pl/function.time.php" target="_blank">http://php.net/manual/pl/function.time.php</a>
  14. */
  15. function time_elapsed_A($secs){
  16. $ret=array();
  17. $bit=array(
  18. 'y'=>$secs/31556926%12,
  19. 'w'=>$secs/604800%52,
  20. 'd'=>$secs/86400%7,
  21. 'h'=>$secs/3600%24,
  22. 'm'=>$secs/60%60,
  23. 's'=>$secs%60
  24. );
  25.  
  26. foreach ($bit as $k=>$v)
  27. if ($v>0) $ret[]=$v.$k;
  28.  
  29. return join(' ', $ret);
  30. }
  31.  
  32. echo 'Ile był: ', time_elapsed_A((strtotime(end($result[0]))-strtotime($result[0][0]))); # pokaż czas..


--------------------
Go to the top of the page
+Quote Post
lekosm2
post 9.10.2015, 08:38:01
Post #3





Grupa: Zarejestrowani
Postów: 141
Pomógł: 0
Dołączył: 9.10.2015

Ostrzeżenie: (0%)
-----


Dzięki! Lkingsmiley.png

A jeszcze jedno, bo w logach mam strasznie dużo osób i chciałbym by zliczało to dla każdego użytkownika, ID użytkownika, będzie przechowywane w przykładowo zmiennej $user_id w logach ID użytkownika jest zapisywane (id:2).


Kod
$TWOJ_LOG="5-10-09 06:23:30.163577|INFO    |VirtualServerBase|  1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
2015-10-09 06:23:33.997875|INFO    |VirtualServerBase|  1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105
2015-10-09 06:23:41.896634|INFO    |VirtualServerBase|  1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
2015-10-09 06:23:43.042064|INFO    |VirtualServerBase|  1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105";


zastąpiłem:
Kod
$TWOJ_LOG = file_get_contents('ts3server_2015-10-05__08_05_51.491210_1.log');


I kolejne pytanie. Da się w jakiś sposób by w zmiennej były wszystkie pliki z logami z folderu "logs"? Bo jak wyżej widać w zmiennej $TWOJ_LOG znajduje się jeden plik z logami, a mam ich kilka w przyszłości nawet kilkadziesiąt.


@edit
Gdy dodałem:
$TWOJ_LOG = file_get_contents('ts3server_2015-10-05__08_05_51.491210_1.log');

Pokazało mi, że mój czas ile byłem to: 3d 22h 17m 44s
A to jest niemożliwe, bo rzeczywisty czas jaki jest w logach, to 10 sekund spędzonego czasu.

Ten post edytował lekosm2 9.10.2015, 08:45:55
Go to the top of the page
+Quote Post
Pyton_000
post 9.10.2015, 09:35:22
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


  1. <?php
  2. $logs = "2015-10-09 06:23:30.163577|INFO |VirtualServerBase| 1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
  3. 2015-10-09 06:23:33.997875|INFO |VirtualServerBase| 1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105
  4. 2015-10-09 06:23:41.896634|INFO |VirtualServerBase| 1| client disconnected 'lekosm2'(id:2) reason 'reasonmsg=leaving'
  5. 2015-10-09 06:23:43.042064|INFO |VirtualServerBase| 1| client connected 'lekosm2'(id:2) from 11.11.11.111:57105
  6. 2015-10-09 06:23:48.042064|INFO |VirtualServerBase| 1| client disconnected 'lekosm2'(id:2) from 11.11.11.111:57105";
  7.  
  8. $usersTime = array();
  9. foreach (explode("\n", $logs) as $log) {
  10. preg_match('/^(.{26})\|.*?client (connected|disconnected) \'(.*?)\'/', $log, $match);
  11. $usersTime[$match[3]][] = array($match[2], strtotime($match[1]));
  12. }
  13.  
  14. foreach ($usersTime as $user => $datas) {
  15. $usersTime[$user]['time'] = 0;
  16. if(isset($datas[0]) && $datas[0][0] == 'disconnected') {
  17. array_shift($datas);
  18. }
  19. $counter = count($datas);
  20. if($counter%2 !== 0) {
  21. pop($datas);
  22. }
  23.  
  24. for ($i=0; $i < $counter; $i +=2) {
  25. $usersTime[$user]['time'] += $datas[$i+1][1] - $datas[$i][1];
  26. }
  27. var_dump($user . ': ' .$usersTime[$user]['time'] .'s');
  28. }


Oczywiście to jest mega do poprawki, optymalizacji itd. To jest szkic tego co chcesz. Nie przyjmuje wiele założeń ale:
jeśli w logu dla usera pierwsze jest disconnect to wywalamy.
Zakłada toto że user zawsze ma parę connect -> disconnect (nie uwzględnia np. connect, connect, disconnect, (np. z 2 klientów równocześnie))

Do tego jeśli wczytujesz z pliku to zamiast explode ma być file() z odpowiednią flagą

Ten post edytował Pyton_000 9.10.2015, 09:35:54
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 12:32