Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czytanie końca pliku, tail w php-ie
mkozak
post 5.01.2010, 15:24:00
Post #1





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Mam taki przypadek:

Po stronie przeglądarki chcę wyświetlić ostatnie linie pliku log serwera. Plik log-ów naturalnie jest textowy i ma wielkość plus nieskończoność (nieskończoność do granic miejsca na macierzy).

Można co prawda otwierać cały plik i go czytać i czytać, ale przy większym pliku jest bezsensu (pamięć i wydajność). Potrzebuje jedynie ostatnie 10 linii pliku.

macie jakiś szybki dobry pomysłquestionmark.gif?


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
Go to the top of the page
+Quote Post
Ociu
post 5.01.2010, 15:27:50
Post #2





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




file + end
Go to the top of the page
+Quote Post
erix
post 5.01.2010, 15:35:03
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
(nieskończoność do granic miejsca na macierzy).

~ociu, tym na pewno osiągnie, co trzeba... tongue.gif

Co do wątku - najlepiej wywołać polecenie powłoki, a jeśli już koniecznie musi być via PHP, to: http://pl.lmgtfy.com/?q=tail+php


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mkozak
post 5.01.2010, 15:42:53
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Pyszna rada.

File wrzuca 120MB do array zjadając momentalnie całą pamięci udostępnioną skryptowi, żeby wczytać ostatnie 10 linijek.

Ktoś ma lepszy pomysł?

Cytat(erix @ 5.01.2010, 15:35:03 ) *
Co do wątku - najlepiej wywołać polecenie powłoki, a jeśli już koniecznie musi być via PHP, to: http://pl.lmgtfy.com/?q=tail+php


Z takim podejściem to równie dobrze można zamknąć to forum i dać wszystkim do zrozumienia, żeby szukać wszędzie indziej tylko nie tu.

Jest pełno class i innego G w necie do symulowania taila, ale czy nie da się tego zrobić jakąś funkcją w PHP??
Albo przynajmniej kombinacją funkcji?questionmark.gif

Już całkiem blisko byłem przy file_get_contents(), gdzie można podać offset i maxlenght.

Można odczytać rozmiar pliku i .... i tu jest właśnie bug, bo funkcja przyjmuje wartość liczbową odpowiadającą kolejnemu znakowi w pliku (np 1400 znak w pliku).

Tylko, że wpisy mają różną długość, ciężko trafić w początek 10 linji od końca.

Najpierw by trzeba było policzyć ilość znaków w pliku - też słaby pomysł.

Ktoś jeszcze ma jakiś pomysłquestionmark.gif

Ten post edytował mkozak 5.01.2010, 15:43:27


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
Go to the top of the page
+Quote Post
Pilsener
post 5.01.2010, 15:42:55
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


File? Człowiek ma problem, by przekopać się przez plik a co dopiero wczytać go do pamięci. Po co ładować plik do pamięci jako tablicę, gdy chcemy odczytać tylko jego koniec?
  1. $uchwyt = fopen($pliczek,'r'); //otwieramy plik
  2. fseek($uchwyt,-100,SEEK_END); //ustawiamy wskaźnik np. 100 bajtów od końca pliku
  3. while(!feof($uchwyt)){ //parsujemy plik od podanego miejsca
  4. $linia = fgets($uchwyt);
  5. echo $linia.'<br />';
  6. }
  7. fclose($uchwyt);
- pisane z palca, ale powinno działać

Musisz mniej więcej obliczyć, ile bajtów od końca to będzie 10 linijek, następnie przeparsować ten fragment i wrzucić linijki do tablicy, z której po odwróceniu odetniesz (array_slice z tego co pamiętam) każdy index większy niż 10.

Edit: w manualu pełno przykładów na różne taile:
http://pl2.php.net/manual/pl/function.fseek.php

Ten post edytował Pilsener 5.01.2010, 16:00:11
Go to the top of the page
+Quote Post
erix
post 5.01.2010, 15:53:24
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Z takim podejściem to równie dobrze można zamknąć to forum i dać wszystkim do zrozumienia, żeby szukać wszędzie indziej tylko nie tu.

Ciężko kliknąć 5. wynik? Naprawdę ciężko?

Cytat
ale czy nie da się tego zrobić jakąś funkcją w PHP??

Nie. Gdyby była, podałbym link do manuala.

Cytat
Ktoś ma lepszy pomysł?

tail wykonane jako polecenie powłoki.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mkozak
post 5.01.2010, 16:05:13
Post #7





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Dzięki Pilsener

GR8 Success

  1. function tail($file, $ile_linijek = 10){
  2. $t_out = array();
  3. $licznik = 0;
  4. // Zapas srednio 128 bajtow na linijke
  5. $ile_bajtow = -128 * $ile_linijek;
  6.  
  7. $uchwyt = fopen($file,'r'); //otwieramy plik
  8.  
  9. fseek($uchwyt,$ile_bajtow,SEEK_END); //ustawiamy wskaźnik np. 100 bajtów od końca pliku
  10.  
  11. while(!feof($uchwyt)){ //parsujemy plik od podanego miejsca
  12. $linia = fgets($uchwyt);
  13. $t_echo[] = $linia;
  14. $licznik++;
  15. }
  16. fclose($uchwyt);
  17.  
  18. //zdejmij ostatnia linijke jezeli pusta
  19. if($t_echo[$licznik] == ''){
  20. array_pop($t_echo);
  21. }
  22.  
  23. //Odlicz ile linijek
  24. for($i = 0; $i<$ile_linijek; $i++){
  25. $t_out[] = array_pop($t_echo);
  26. }
  27.  
  28. return $t_out;
  29.  
  30. }


Cytat(erix @ 5.01.2010, 15:53:24 ) *
Ciężko kliknąć 5. wynik? Naprawdę ciężko?

Nie. Gdyby była, podałbym link do manuala.

tail wykonane jako polecenie powłoki.


Widzę, że ktoś tu tylko nabija ilość postów, zamiast przeprowadzić rzeczową dyskusję....... dry.gif

Ten post edytował mkozak 5.01.2010, 16:03:46


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
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: 14.07.2025 - 12:45