Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Inotify i problem przy usuwaniu wielu plików na raz
Forum PHP.pl > Forum > Przedszkole
nosbyd
Cześć,

Mam problem z inotify w PHP, otóż pewien kod wykonuje się w pętli while:

  1. $fd = inotify_init();
  2. $watch_descriptor = inotify_add_watch($fd, $dir, IN_ALL_EVENTS);
  3. $connection = mysqli_connect("localhost", "testuser", "admin", "bazaTestowa") or die("DB Connection error . . .");
  4.  
  5. while (true)
  6. {
  7. $events = inotify_read($fd);
  8. if ($events[0]['wd'] === $watch_descriptor){
  9. if ($events[0]['mask'] === IN_CREATE)
  10. {
  11. $action = "created";
  12. InsertValue($table_name, $file_name, $action, $date, $connection);
  13. }
  14.  
  15. if ($events[0]['mask'] === IN_DELETE)
  16. {
  17. $action = "deleted";
  18. InsertValue($table_name, $file_name, $action, $date, $connection);
  19. }
  20. }
  21. elseif ($events[0]['wd'] === $watch_descriptor)
  22. {
  23. }
  24. }


i ten oto inotify nie nadąża z dodawaniem rekordów do bazy podczas jednoczesnego usuwania wielu plików. Tzn. jeśli wrzucam do śledzonego katalogu 10 plików, wszystkie dodają się po kolei z kilku milisekundowym odstępem czasowym, to do bazy doda się 10 nowych rekordów. Ale jeśli te same pliki usuwam, dzieje się to jednocześnie, inotify tak jakby nie wyrabia i pomija wykonanie dodawania rekordów do bazy, w wyniku czego zamiast info o 10 usuniętych plikach, w bazie są tylko np 4, albo 5 rekordów...
Próbowałem z usleep po InsertValue, nie działa.

Nie mam zielonego pojęcia jak to ogarnąć... Może Wy mielibyście jakiś pomysł? worriedsmiley.gif
nospor
Jestes na 100% pewien ze to wina bazy? Sprawdzales? Bo moze twoja petla while najzwyklej w swiecie gubi eventy
nosbyd
Jestem prawie pewien, że baza jest ok.
Tak samo jestem prawie pewien, że właśnie pętla gubi eventy, a bardziej wyobrażam sobie to w ten sposób, że podczas usuwania tych 10 plików jednocześnie, pętla zdąży się wykonać tylko 4-5 razy. Podejrzewam, że to jest "najzwyklejszy w świecie" problem, dlatego też piszę w dziale Przedszkole, ale nie mogę sobie z tym poradzić... sad.gif
Pyton_000
Spróbuj zalogować sobie do pliku wartości z `$events[0]['mask']` np:

Kod
file_put_contents('data.log', $events[0]['mask'].PHP_EOL, FILE_APPEND);


po

if ($events[0]['wd'] === $watch_descriptor){


Aa. i no czy przypadkiem nie ma w `$events` większej ilości eventów o plikach? Bo może jest tak że jest tam pakowane np. event dla 3 plików bo one weszły w "transakcję"
nosbyd
Cytat(Pyton_000 @ 6.01.2020, 19:28:44 ) *
może jest tak że jest tam pakowane np. event dla 3 plików bo one weszły w "transakcję"


Tak jest, sprawdziłem, w $events jest czasem po jednym, czasem po kilka eventów o plikach.

Dorzuciłem coś takiego:
  1. foreach($events as $key=>$val){
  2. echo implode(' - ', $val);
  3. echo "\n";
  4. }
  5. echo "\nNext\n";

i konsola wyświetliła kilka plików, Next, kilka plików, Next...

Spróbuję więc wrzucić wszystko w tego foreach'a, zastanawiam się tylko, czy nie będzie tu za dużo pętli w pętlach...

Dam jeszcze znać, czy działa, dzięki za dotychczasową pomoc smile.gif
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.