Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PLIKI] Odczytanie X ostatnich linii pliku
kiler129
post
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Witajcie!
Skrypt który pisze ma dość specyficzne środowisko uruchomieniowe - nieco ponad 150Mhz procesora ARM i 80MB ramu.
Początkowo wykonywałem komendę "tail -n 4 plik" jednakże w pętli jest to mało efektywne. Do tego stopnia, że dla 10 elementów zajmuje to ok 2 sekund (jest to nie do zaakceptowania w moim przypadku).
Przez ostatnią godzinę krążę w kółko - fopen, fgets itp. Niestety nie wiem jak pobrać ostanie X linii z pliku. Pobranie z początku nie sprawia mi problemu:
  1. function unix_head($f, $n) { //Pobiera n linii z początku pliku
  2. $fp = @fopen($f, "r");
  3. $ret = "";
  4. $i = 0;
  5. while(!feof($fp) && $i<$n) {
  6. $ret .= fgets($fp);
  7. $i++;
  8. }
  9. fclose($fp);
  10. return $ret;
  11. }

Mogę co prawda użyć funkcji file() i pobawić się tablicą jednakże ładowanie do pamięci całego pliku (od 100KB do 1MB) nie ma nic wspólnego z wydajnością (IMG:style_emoticons/default/dry.gif)


Czy któryś z kolegów może podać mi sposób na implementację funkcji tail w php?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
IceManSpy
post
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Tutaj masz odczytanie ile jest linii:
  1. <?php
  2. $file = "somefile.txt";
  3. $lines = count(file($file));
  4. echo "There are $lines lines in $file";
  5. ?>

Wtedy będziesz mógł puścic pętle od $lines-10 do $lines.
Go to the top of the page
+Quote Post
kiler129
post
Post #3





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Cytat(IceManSpy @ 22.09.2010, 00:19:29 ) *
Tutaj masz odczytanie ile jest linii:
  1. <?php
  2. $file = "somefile.txt";
  3. $lines = count(file($file));
  4. echo "There are $lines lines in $file";
  5. ?>

Wtedy będziesz mógł puścic pętle od $lines-10 do $lines.


Niestety nie wchodzi to w grę - file() ładuje cały plik do pamięci jako tablicę co z góry odpada przy zasobach jakie posiadam.
Udało mi się odgrzebać w swoich zbiorach taką funkcję a następnie lekko zmodyfikować:
  1. function unix_tail($f, $n) {
  2. $fp = fopen($f, "r");
  3. $pos = -2;
  4. $start = false;
  5. $ret = "";
  6. while($n > 0) {
  7. $t = " ";
  8. while($t != "\n") {
  9. if(fseek($fp, $pos, SEEK_END) == -1) {
  10. $start = true;
  11. break;
  12. }
  13. $t = fgetc($fp);
  14. $pos--;
  15. }
  16. $n--;
  17.  
  18. if($start) {
  19. rewind($fp);
  20. }
  21. $ret = $ret.fgets($fp);
  22. if($start) break;
  23. }
  24. fclose($fp);
  25. return $ret;
  26. }

Jednakże i ona ma swoje wady - te dwie pętle w sobie nie są zbyt wydajne. Ktoś na sali ma pomysł na optymalizację?
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 28.12.2025 - 17:44