The Senario:
W każdym wierszu znajduje się plik z ciągiem znaków (średnia wartość zdania). Dla argumentów, powiedzmy, że ten plik ma rozmiar 1 Mb (tysiące linii).
Masz skrypt, który odczytuje plik, zmienia niektóre ciągi w dokumencie (nie tylko dodaje, ale także usuwa i modyfikuje niektóre wiersze), a następnie zastępuje wszystkie dane nowymi danymi.
Pytania:
Czy PHP, system operacyjny lub httpd itd. „Serwer” ma już systemy umożliwiające zatrzymanie takich problemów (odczyt / zapis w połowie zapisu)?
Jeśli tak, proszę wyjaśnić, jak to działa, i podać przykłady lub linki do odpowiedniej dokumentacji.
Jeśli nie, czy są rzeczy, które mogę włączyć lub skonfigurować, takie jak blokowanie pliku do momentu zakończenia zapisu i wykonywanie wszystkich innych odczytów i / lub zapisów, dopóki poprzedni skrypt nie zakończy pisania?
Moje założenia i inne informacje:
Na tym serwerze działa PHP i Apache lub Lighttpd.
Jeśli skrypt jest wywoływany przez jednego użytkownika i znajduje się w połowie zapisu do pliku, a inny użytkownik czyta plik w tym samym momencie. Użytkownik, który ją czyta, nie otrzyma pełnego dokumentu, ponieważ nie został jeszcze napisany. (Jeśli to założenie jest błędne, proszę mnie poprawić)
Zajmuję się tylko pisaniem i odczytywaniem PHP do pliku tekstowego, a w szczególności funkcjami „fopen” / „fwrite” i głównie „file_put_contents”. Przejrzałem dokumentację „file_put_contents”, ale nie znalazłem poziomu szczegółowości ani dobrego wyjaśnienia, co oznacza flaga „LOCK_EX”.
Scenariusz jest przykładem najgorszego scenariusza, w którym przypuszczam, że te problemy są bardziej prawdopodobne ze względu na duży rozmiar pliku i sposób edycji danych. Chcę dowiedzieć się więcej o tych problemach i nie chcę ani nie potrzebuję odpowiedzi ani komentarzy, takich jak „użyj mysql” lub „dlaczego to robisz”, ponieważ tego nie robię, chcę tylko dowiedzieć się o czytaniu / zapisywaniu plików z PHP i nie wyglądam we właściwych miejscach / dokumentacji i tak, rozumiem, że PHP nie jest idealnym językiem do pracy z plikami w ten sposób.
file_put_contents()
to tylko opakowanie do fopen()/fwrite()
tańca, LOCKEX
robi to samo, jakbyś zadzwonił flock($handle, LOCKEX)
.