Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]dodawanie do pliku
Forum PHP.pl > Forum > Przedszkole
gitbejbe
witam

Pisze bo wyczerpałem wszystkie pomysły.

Robie cykliczną zapiske danych do pliku. Treść takie pliku wygląda w ten sposób

  1. 0 config1: 0
  2. 1 config2: 0
  3. 2 config3: 0
  4. 3 config4: 0
  5. 4
  6. 5 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:22
  7. 6 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:21
  8. 7 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:21
  9. 8 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:20
  10. 9 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:20
  11. 10 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:19
  12. 11 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:18
  13. 12 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:18
  14. 13 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:17
  15. 14 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:17
  16. 15 pomiar: dane urzadzenia nr: 1 | data: 2013-10-22 07:32:16


liczba z lewej przy kazdym wierszu określa numer tego wiersza w tablicy. Teraz skrypt:

  1. if (file_exists($sciezka))
  2. {
  3. $dane=file($sciezka); //tworzy tablice
  4. $plik=fopen($sciezka,'w+'); //otwiera do zapisu
  5. array_splice($dane, 5, 0, $data."\r"); //wstawia dane od 5 elementu tablicy, bo pierwsze 4 to linie konfiguracyjne
  6.  
  7. $text=''; //bufor
  8. if (flock($plik, LOCK_EX|LOCK_NB)) //blokuje plik
  9. {
  10. foreach($dane as $line_number => $value)
  11. {
  12. echo ''.$line_number.' '.$value.'<br>';
  13. if($line_number >= self::$lines_limit_on_file) //korekcja - max 15 linijek w dokumencie
  14. {
  15. unset($dane[$line_number]);
  16. }
  17. else
  18. {
  19. $text.= $dane[$line_number];
  20. }
  21. }
  22. flock($plik, LOCK_UN);
  23. fwrite($plik,$text);
  24. }
  25. else
  26. {
  27. echo'PLIK ZABLOKOWANY';
  28. }
  29. fclose($plik);
  30. }


działa, ale występuje pewien problem na który wpadłem zupelnie przypadkowo. Skrypt ma na celu zapisać od 5 lini w pliku dane pomiarowe z pewnego urządzenia - cyklicznie co pare sekund. Testuje to narazie na ajaxie i gitara. Lecz gdy odpale kilka-kilkanasie razy ten sam skrypt do wykonywania - czyli stworze środowisko np kilku urzadzeń ktore zapisywałyby dane do tego samego pliku, to skrypt zaczyna sie sypac.
W pewnym momencie dochodzii do kolizji i caly plik zapisywany jest na nowo - czyli traci wszystkie linijki - łącznie z tymi konfiguracyjnymi. Problem lezy po tej stronie, że przed zablokowaniem pliku skrypt dokonuje zamiany wierszy w pliku na tablice poprzez funkcje file(). jesli kilka urzadzeń działa na tym samym pliku, to w końcu trafi się moment gdy plik zostanie zablokowany akurat wtedy gdy funkcja file() będzie tworzyć tablice. Skutkiem tego jest utworzenie niepełnej lub pustej tablicy która kasuje mi całą zawartośc pliku.

Jak to rozwiązać ? idealnym rozwiązenim byłoby stworzyć tablice pliku poprzez funkcje file() ale dopiero wtedy gdy plik jest zablokowany, a tego ni jak nie idzie zrobić. Macie jakiś pomysł ?

EDIT:

Rozwiazałem problem... Wina cały czas leżała w trybie odczytu pliku. Zamiast w+ powinno byc r+. Do zamknięcia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.