Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapisywanie pliku (np. xml) a wielu użytkowników
Forum PHP.pl > Forum > PHP
shpaque
Witam serdecznie,
dziś chciałem zapytać o blokady lub ograniczenia w zapisie pliku, który powiedzmy może być zapisywany w tym samym czasie przez wiele osób - klientów przeglądarek. Czy przed np. błędnym zapisem lub pominięciem jakiegoś zapisu można się jakoś ochronić biorąc pod uwagę jeden plik?

Przyjmijmy, że mam taki wycinek, który zapisuje xml, ale żeby ten xml jeszcze "upiększyć" dodatkowo po zapisie robi pewną funkcję:

  1. function formatXml($simpleXMLElement) {
  2. $xmlDocument = new DOMDocument('1.0', 'utf-8');
  3. $xmlDocument -> preserveWhiteSpace = false;
  4. $xmlDocument -> formatOutput = true;
  5. $xmlDocument -> loadXML($simpleXMLElement -> asXML());
  6. return $xmlDocument -> saveXML();
  7. }
  8.  
  9. ...
  10.  
  11. $newUser -> asXML($pathToUsersFile);
  12.  
  13. $beautifyXML = htmlspecialchars(formatXml($usersFile));
  14. $beautifyXML = html_entity_decode($beautifyXML);
  15. $beautyFile = fopen($pathToUsersFile, 'w');
  16. flock($beautyFile, LOCK_EX); // lub LOCK_SH dla blokady dzielonej
  17. fwrite($beautyFile, $beautifyXML);
  18. flock($beautyFile, LOCK_UN);
  19. fclose($beautyFile);
  20. ...


tylko pytanie co w momencie gdy np 100, 1000, 100000 userów w jednym czasie zainicjuje ten kod? Czy asXML (saveXML) kolejkuje wtedy jakoś? Czy lock i unlock również kolejkuje przy blokadzie dzilonej (SH) czy po prostyu w momencie kiedy plik jest w użyciu/zapisywany - to innego w tym samym czasie usera po prostu ominie..?

@EDIT

Dziękuję za zainteresowanie....
nospor
Pliki generalnie nie sluza do przechowywania danych, w ktorych kazdy pisze non stop. Po co wiec taki zabieg z twojej strony? Czemu poprostu nie baza danych?
netir
przy tym ustawieniu z dokumentacji wynika, że to zadziała jak "waitUntil", ale jak zakładasz, że ten proces może być wykonany więcej niż raz w jednej chwili to podejście jest złe. Nie wiadomo jak serwer zachowa się przy 1000, prawdopodobnie jak człowiek, który zje śliwki i popije kefirem.

Przetestować możesz to bardzo łatwo, flocka daj w if'a, w środku sleep(t) i odpalaj sobie w nowych kartach.

Jeżeli ten plik musi się budować instant to zrób własne kolejkowanie (Cron + db), ale krok wcześniej, czyli w momencie jak user dodaje nowy item do tego XML'a, wtedy do kolejki może dodać się 10000 w 1 chwili, a system przemieli sobie to po kolei bez ciśnienia jak w analogii ze śliwkami.

p.s
błagam nie rób spacji przy operatorze obiektu, powinno być tak:

  1. $xmlDocument->preserveWhiteSpace = false
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.