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:
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? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%)
|
Musisz użyć fseek by poruszać się po pliku, już raz odpowiadałem na takie pytanie:
http://forum.php.pl/index.php?showtopic=13...st&p=698149 |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%)
|
Musisz użyć fseek by poruszać się po pliku, już raz odpowiadałem na takie pytanie: http://forum.php.pl/index.php?showtopic=13...st&p=698149 Podane przez ciebie rozwiązanie ma sens (i je znam) ale ma jednego buga - co jeśli linia ma zmienna długość od 10 do 400B? ;] Przekopałem już sporo kodu w internecie i chyba tylko to co udało mi się znaleźć w swoich zbiorach działa w każdych warunkach (szukając \n). edit: W manie dokopałem się też do innego sposobu realizacji. Ma ograniczenie do 4KB/linię (chyba że się mylę w interpretacji kodu to proszę mnie poprawić). Jest nieco szybsza (~18%) od mojej. Delikatnie zmodyfikowałem aby nie pluło tyle notice oraz domyślną ilość linii dla zgodności z *nixowym tailem (10 zamiast 100) (IMG:style_emoticons/default/winksmiley.jpg)
edit2: Pospieszylem się ... moja funckcja zawiera błąd powodujący odwrócenie kolejności linii. edit3: Jak widać zagadnienie taila w php nie jest takie banalne jak mogło by się wydawać. Po testach pokazana wyżej funkcja robi błędy! Nie starałem się jej debugować jednakże czasami zwraca 3 linie zamiast 4, czasami pusty string (wtf?!). Poprawiłem nieco moją funkcję dodając zmieniając return $ret na implode("\n", array_reverse(explode("\n", $ret))) [tak na szybko] i działa względnie poprawnie ... chociaż też nie do końca. Czy ktokolwiek jest w stanie pokazać dlaczego ni jedna ni druga funkcja nie działają w 100% poprawnie? Ew. czy ktoś zna C i może powiedzieć jak robi to oryginalny tail? edit4: Udało mi się znaleźć funkcję która działa i jest 3x szybsza od mojej. Naśladuje praktycznie w 100% taila.
Ten post edytował kiler129 22.09.2010, 18:48:52 |
|
|
|
kiler129 [PLIKI] Odczytanie X ostatnich linii pliku 21.09.2010, 23:02:44
IceManSpy Tutaj masz odczytanie ile jest linii:
[PHP] pobier... 21.09.2010, 23:19:29 
kiler129 Cytat(IceManSpy @ 22.09.2010, 00:19:2... 21.09.2010, 23:34:37
Pilsener CytatPodane przez ciebie rozwiązanie ma sens (i je... 23.09.2010, 12:41:09 ![]() ![]() |
|
Aktualny czas: 27.12.2025 - 20:52 |