Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podwójnie wpisywane dane w fputs()
Forum PHP.pl > Forum > Przedszkole
Vexis
Witam,

męczę się już kilka godzin z zagadnieniem dotyczącym zapisywania do pliku. Znalazłem w google tematy ludzi z podobnym problemem, ale nigdzie nie znalazłem rozwiązania, które u mnie by pomogło. Kłopotliwy kod:

  1. ...
  2. $plik = fopen($sciezka, "a");
  3.  
  4. ...
  5.  
  6. fputs($plik, $faktura);
  7. fclose($plik);
  8. //file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);
  9. ...


Problem polega na tym, że dane wpisane do pliku niezależnie od metody fputs (fwrite) czy file_put_contents są zdublowane. Zależy mi, żeby dane dopisywały się na końcu i zawsze dzieje się to podwójnie. Sprawdziłem i jestem pewien, że nigdzie w kodzie nie ma podwójnie wywołanej funkcji. Cały kod wykonuje się raz, a fputs zachowuje się jakby została wywołana podwójnie. Sprawdzałem i przełączyłem fopen w tryb "r+", użyłem fseek, żeby się przesunąć na koniec pliku i zauważyłem coś ciekawego. Jak jestem na końcu pliku i próbuje coś wpisać to się dubluje, jak się przesunę od końca na więcej niż potrzeba na wpisane danych to problem nie występuje. Wygląda na to, że w momencie kiedy "kończy" się plik to dane wpisywane są ponownie. Testowałem różne przeglądarki i różne komputery, wszędzie ten sam problem.

Nie mam już pomysłu jak to naprawić. Kombinowałem, żeby może po zapisie kasować z pliku dane, ale żeby to zrobić to muszę ponownie zapisać poprawione dane, które ponownie się dublują... Ktoś ma jakiś pomysł?
nospor
Cytat
Jak jestem na końcu pliku i próbuje coś wpisać to się dubluje, jak się przesunę od końca na więcej niż potrzeba na wpisane danych to problem nie występuje.
Bo jak przesuwasz za kazdym razem powiedzmy 10 do tylu, a tekst ma dlugosc 5 to chocbys i go 100 razy odpalil to zawsze bedziesz widzial swoj wpis tylko raz bo tekst w pliku jest nadpisywany a nie dopisywany.

Twoj kod odpala sie dwa razy i tyle. Chocby przez jakies mod rewrite czy inne podobne sytuacje. Ciezko wywrozyc nie majac calosci.
Vexis
Cytat(nospor @ 7.04.2017, 13:58:26 ) *
Bo jak przesuwasz za kazdym razem powiedzmy 10 do tylu, a tekst ma dlugosc 5 to chocbys i go 100 razy odpalil to zawsze bedziesz widzial swoj wpis tylko raz bo tekst w pliku jest nadpisywany a nie dopisywany.

Twoj kod odpala sie dwa razy i tyle. Chocby przez jakies mod rewrite czy inne podobne sytuacje. Ciezko wywrozyc nie majac calosci.


Owszem wywołuje się dwa razy, ale tylko i wyłącznie fputs(), niżej w kodzie mam alerta i pojawia się tylko raz. Wszystko poza tym wykonuje się raz. Wpis na końcu pliku zawsze zdublowany :/
nospor
Zrozum, alerta widzisz raz, bo to masz jako glowne żądanie. A gdzies w tle moze leciec dodatkowe żądanie, ktorego wyniku juz nie widzisz. A moze leciec np. przez zle zrobiony mod_rewrite i przekierowuje sie do skryptu gdy nie ma jakiegos css, js czy image. Wielokrotnie to sie na forum powtarzalo i wszyscy jak ty teraz sie upierali ze nic takiego sie nie dzieje a jednak zawsze sie dzialo. Do wyjatkow nie nalezysz wink.gif
Vexis
No właśnie chcę zrozumieć, ale chyba mi coś nie idzie... Ten plik który tworze ma za zadanie wyeksportować dane do pliku txt, te dane kolejną są wpisywanie w zmienną. Wszystko działa idealnie. Czemu w takim układzie w momencie wpisywania do pliku zawartości zmiennej ta wartość się dubluje? Jakbyś mógł bez nerwów mi pomóc to zrozumieć to będę Ci bardzo wdzięczny.

Edit:
Próba fputs($plik, 'test');
daje takie same efekty.
Pyton_000
To teraz dodaj sobie

Kod
file_put_contents('test.log', var_export($_SERVER, true), FILE_APPEND);

przed fputs()

i po requeście pokaż wynik.
Vexis
Cytat(Pyton_000 @ 7.04.2017, 14:30:57 ) *
To teraz dodaj sobie

Kod
file_put_contents('test.log', var_export($_SERVER, true), FILE_APPEND);

przed fputs()

i po requeście pokaż wynik.


Jeżeli dobrze rozumiem to testowałem wcześniej:

  1. file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);


co również dubluje mi dane w pliku wyjściowym.
Pyton_000
To teraz potrenj czytanie ze zrozumieniem...
Vexis
Cytat(Pyton_000 @ 7.04.2017, 14:35:52 ) *
To teraz potrenj czytanie ze zrozumieniem...


Mój błąd.

  1. 'HTTP_HOST' => '192.168.111.76',
  2. 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
  3. 'HTTP_ACCEPT' => '*/*',
  4. 'HTTP_ACCEPT_LANGUAGE' => 'pl,en-US;q=0.7,en;q=0.3',
  5. 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
  6. 'HTTP_BS_EDOK_REFERER' => '---',
  7. 'HTTP_BS_EDOK_JS_TOK' => '---',
  8. 'CONTENT_TYPE' => 'application/x-www-form-urlencoded;',
  9. 'HTTP_REFERER' => '---',
  10. 'CONTENT_LENGTH' => '1909',
  11. 'HTTP_COOKIE' => '---',
  12. 'HTTP_CONNECTION' => 'keep-alive',
  13. 'PATH' => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
  14. 'SERVER_SIGNATURE' => '',
  15. 'SERVER_SOFTWARE' => 'Apache/2.4.10 (Debian)',
  16. 'SERVER_NAME' => '192.168.111.76',
  17. 'SERVER_ADDR' => '192.168.111.76',
  18. 'SERVER_PORT' => '80',
  19. 'REMOTE_ADDR' => '192.168.111.62',
  20. 'DOCUMENT_ROOT' => '---',
  21. 'REQUEST_SCHEME' => 'http',
  22. 'CONTEXT_PREFIX' => '---',
  23. 'CONTEXT_DOCUMENT_ROOT' => '---',
  24. 'SERVER_ADMIN' => '---',
  25. 'SCRIPT_FILENAME' => '---/fservice.php',
  26. 'REMOTE_PORT' => '60701',
  27. 'GATEWAY_INTERFACE' => 'CGI/1.1',
  28. 'SERVER_PROTOCOL' => 'HTTP/1.1',
  29. 'REQUEST_METHOD' => 'POST',
  30. 'QUERY_STRING' => '',
  31. 'REQUEST_URI' => '---',
  32. 'SCRIPT_NAME' => '---/fservice.php',
  33. 'PATH_INFO' => '---',
  34. 'PATH_TRANSLATED' => '---',
  35. 'PHP_SELF' => '---',
  36. 'REQUEST_TIME_FLOAT' => 1491568864.562,
  37. 'REQUEST_TIME' => 1491568864,
  38. )


Wybacz, ale musiałem wyciąg dane zawierające informacje o kliencie.
Pyton_000
No i co, dodało się raz...
to teraz w tym twoim:
Kod
file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);

zamień na
file_put_contents($sciezka, var_export($_SERVER, true), FILE_APPEND | LOCK_EX);

i j.w wynik...
Vexis
Cytat(Pyton_000 @ 7.04.2017, 14:50:08 ) *
No i co, dodało się raz...
to teraz w tym twoim:
Kod
file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);

zamień na
file_put_contents($sciezka, var_export($_SERVER, true), FILE_APPEND | LOCK_EX);

i j.w wynik...


Dodało się dwa razy tylko ja skopiowałem jeden egzemplarz :/
nospor
Cytat
Dodało się dwa razy tylko ja skopiowałem jeden egzemplarz :/
Wiec masz kolejny dowod na to, ze mowie prawde tongue.gif Twoj kod jest wykonywany dwa razy. Potencjalne powody tego stanu juz ci podalem
Vexis
Cytat(nospor @ 7.04.2017, 15:07:03 ) *
Wiec masz kolejny dowod na to, ze mowie prawde tongue.gif Twoj kod jest wykonywany dwa razy. Potencjalne powody tego stanu juz ci podalem


Okej, przyjmuje to do wiadomości, ale nie potrafię zrozumieć czemu akurat funkcje wpisujące coś to pliku wykonują się dwa razy. Nie jestem administratorem serwera na którym to wszystko stoi, więc nie jestem w stanie tego zweryfikować :/

Skoro nie jestem w stanie naprawić problemu to może da się go obejść? Zastanawiam się czy można jakoś usunąć duplikat z pliku tak, żeby nie używać fwrite ponownie.
Pyton_000
facepalmxd.gif sciana.gif No po co ja pisałem żebyś wysłał zawartośc pliku... no po co...

wklej tutaj: https://www.diffchecker.com/
po lewej 1sze wystąpienie array a po prawej drugie i pokaż diff wygenerowany....


Załamałeś mnie....

Zmieniłem zdanie... Wyślij wynik mi na PW bez zamazywania (no chyba że oba są dokładnie takie same)...
viking
Pokaz adres jesli jest publicznie dostepny.
Vexis
Cytat(Pyton_000 @ 7.04.2017, 15:14:29 ) *
facepalmxd.gif sciana.gif No po co ja pisałem żebyś wysłał zawartośc pliku... no po co...

wklej tutaj: https://www.diffchecker.com/
po lewej 1sze wystąpienie array a po prawej drugie i pokaż diff wygenerowany....


Załamałeś mnie....

Zmieniłem zdanie... Wyślij wynik mi na PW bez zamazywania (no chyba że oba są dokładnie takie same)...


Wybacz, myślałem, że interesują Cię informacje a nie to czy jest zdublowane. Wpis jest podwójny, identyczny, tak jak wcześniej. Nie ma powodu to wściekania się, serio...

Cytat(viking @ 7.04.2017, 15:14:36 ) *
Pokaz adres jesli jest publicznie dostepny.


Niestety nie mam jak, całość stoi na testowym serwerze firmowym bez dostępu z zewnątrz w tym przypadku :/

Edit:
Sprawdziłem na prywatnym serwerze i wszystko działa prawidłowo, bez dublowania. Także macie w pełni racje - wina leży po stronie serwera firmowego. Ktoś ma może pomysł gdzie dokładnie szukać przyczyny? Nie jestem administratorem tamtego serwera, więc potrzebuje punktu zaczepienia, żeby wskazać adminowi.
nospor
Cytat
Ktoś ma może pomysł gdzie dokładnie szukać przyczyny? Nie jestem administratorem tamtego serwera, więc potrzebuje punktu zaczepienia, żeby wskazać adminowi.
Podalem ci jedna z przyczyn
Vexis
Cytat(nospor @ 8.04.2017, 11:39:53 ) *
Podalem ci jedna z przyczyn


"mod rewrite " - widziałem i dziękuje za pomoc. W poniedziałek spróbuje coś w tym kierunku wskórać.

Czy przychodzą Ci do głowy jeszcze inne możliwości?

//////

Dowiedziałem się, że podwójne wykonywanie kodu w miejscu w którym pisałem swój kod (rozszerzenie klasy) jest jak najbardziej prawidłową i pożądaną funkcjonalnością w związku z czym udało mi się obejść problem w sposób bardzo nieelegancji, aczkolwiek dla moich potrzeb skuteczny.

  1. public function zapis($sciezka, $faktura) {
  2. if (!file_exists($sciezka.'1.txt')) {
  3. $plik = fopen($sciezka.'1.txt', "w"); // otwarcie pliku
  4. flock($plik, LOCK_EX); // blokada pliku do zapisu
  5. fwrite($plik, $faktura); // zapis do pliku
  6. flock($plik, LOCK_UN); // zwolnienie blokady
  7. fclose($plik); // zamkniecie pliku
  8. } elseif (!file_exists($sciezka.'2.txt')) {
  9. $plik = fopen($sciezka.'2.txt', "w");
  10. fclose($plik);
  11. } elseif (file_exists($sciezka.'2.txt') AND !file_exists($sciezka.'3.txt')) {
  12. $plik = fopen($sciezka.'2.txt', "r+"); // otwarcie pliku
  13. flock($plik, LOCK_EX); // blokada pliku do zapisu
  14. fwrite($plik, $faktura); // zapis do pliku
  15. flock($plik, LOCK_UN); // zwolnienie blokady
  16. fclose($plik); // zamkniecie pliku
  17. $plik = fopen($sciezka.'3.txt', "w");
  18. fclose($plik);
  19. } elseif (file_exists($sciezka.'3.txt')) {
  20. $plik = fopen($sciezka.'3.txt', "w"); // otwarcie pliku
  21. flock($plik, LOCK_EX); // blokada pliku do zapisu
  22. fwrite($plik, $faktura); // zapis do pliku
  23. flock($plik, LOCK_UN); // zwolnienie blokady
  24. fclose($plik); // zamkniecie pliku
  25. }
  26. }


W związku z powyższym dziękuje za pomoc i proszę o zamknięcie tematu.
Pyton_000
Po prostu zajebiste rozwiązanie.... Palce lizać... Gdybyśmy razem pracowali to dostałbyś takiego kopa za to że nie dałbyś rady siedzieć przez cały dzień...
Vexis
Poradziłem sobie tak jak na tę chwile potrafię. Nie jestem w stanie zablokować podwójnego wykonywania kodu. Nie znam żadnego programisty, który wspomógłby radą, więc improwizuje. Chyba wolałbym tego kopa dostać, bo pewnie bym się czegoś od Ciebie nauczył w związku z tym :-)
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.