Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapisywanie pliku (np. xml) a wielu użytkowników
shpaque
post 11.05.2020, 07:34:24
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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....

Ten post edytował shpaque 8.05.2020, 12:36:49
Go to the top of the page
+Quote Post
nospor
post 11.05.2020, 09:58:39
Post #2





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
netir
post 11.05.2020, 17:04:00
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 5
Dołączył: 20.05.2019

Ostrzeżenie: (0%)
-----


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


Ten post edytował netir 11.05.2020, 17:07:51
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 21:03