Mam dwa różne pliki PHP, które zapisują do tego samego pliku. Każdy skrypt PHP jest wywoływany przez akcję użytkownika dwóch różnych stron HTML. Wiem, że będzie możliwe wywoływanie dwóch plików PHP, ale czy oba pliki PHP spróbują jednocześnie pisać do pliku? Jeśli tak, co się stanie? Możliwe jest również, aby jeden z błędów PHP zawiódł (zapis pliku po prostu zawiedzie, a inny PHP może zapisać do pliku), ponieważ jedna funkcja PHP jest mniej ważna niż druga.Jednoczesne zapisywanie plików PHP
Odpowiedz
Zwykłym sposobem rozwiązania tego jest mieć oba skrypty używać flock()
do blokowania:
$f = fopen('some_file', 'a');
flock($f, LOCK_EX);
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
fclose($f);
Spowoduje skrypty czekać na siebie, aby zrobić z plikiem przed napisaniem do niego. Jeśli lubią, „mniej ważne” skrypt może zrobić:
$f = fopen('some_file', 'a');
if(flock($f, LOCK_EX | LOCK_NB)) {
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
}
fclose($f);
tak, że nie tylko nic zrobić, jeżeli stwierdzi, że coś jest zajęty z pliku.
Spójrz na funkcję flock.
FYI: stada działa tylko na * nix i nie jest dostępna w systemie Windows
Z dokumentacji PHP: "flock() pozwala na wykonanie prostego modelu czytnik/program piszący, który może być używany na praktycznie każdej platformie (włączając większość pochodnych Uniksa, a nawet Windows)." – cdmckay
Podczas gdy 'flock' jako wywołanie systemowe nie jest zaimplementowane w systemie Windows, jest on wyodrębniany w funkcji PHP' flock'. – Piskvor
Tak, źle mówiłem. To jest błąd, o którym myślałem, kiedy powiedziałem, że nie jest dostępny w systemie Windows: http://bugs.php.net/bug.php?id = 39138 (czas, którego potrzebowałem na lokalnym serwerze dev systemu Windows, natknąłem się na to i od tego czasu uniknąłem go na komputerach Windows). Zachowaj spokój i nie przerywaj. – xentek
Uwaga:
Od PHP 5.3.2, automatycznym odblokowaniem gdy uchwyt Resource plik jest zamknięta została usunięta . Odblokowanie teraz zawsze musi być wykonane ręcznie.
Zaktualizowana kod wstecznie kompatybilny jest:
if (($fp = fopen('locked_file', 'ab')) !== FALSE) {
if (flock($fp, LOCK_EX) === TRUE) {
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN);
}
fclose($fp);
}
to trzeba zadzwonić flock (.., LOCK_UN) wyraźnie ponieważ fclose() nie robić tego więcej.
Należy pamiętać, że posix stwierdza dostęp atomowy, jeśli pliki są otwarte jako dołączyć. Oznacza to, że możesz po prostu dołączyć do pliku kilka wątków, a wiersze nie zostaną uszkodzone.
Zrobiłem to przy pomocy kilkunastu wątków i kilkuset tysięcy linii. Żadna z linii nie była uszkodzona.
Może nie działać z ciągami powyżej 1kB, ponieważ bufor może przekroczyć.
Może to również nie działać w systemie Windows, który nie jest zgodny z POSIX.
- 1. Jednoczesne żądania skryptu PHP
- 2. Jednoczesne przesyłanie strumieniowe i zapisywanie wideo?
- 3. Zapisywanie RDD do wielu plików w PySpark
- 4. Jednoczesne korzystanie z trwałego gniazda PHP
- 5. Odczytywanie/zapisywanie plików binarnych
- 6. Zapisywanie źródła jaźni (PHP)
- 7. Zapisywanie/otwieranie Java Obiekty plików
- 8. Asynchroniczne zapisywanie plików w pythonie?
- 9. Jednoczesne połączenia
- 10. Android - zapisywanie/zapisywanie plików tylko z kodu natywnego
- 11. Zapisywanie plików lokalnie za pomocą elektronu
- 12. Zapisywanie plików na koncie Dropbox z GAE
- 13. Niezawodne zapisywanie plików (File.Replace) w pracowitym środowisku
- 14. MSBuild - Zapisywanie znaków ewakuacyjnych do plików
- 15. Odczytywanie i zapisywanie plików w QML (Qt)
- 16. Czytanie/zapisywanie metadanych plików audio/wideo
- 17. zapisywanie wielu plików za pomocą xcopy
- 18. Jednoczesne AVCaptureVideoDataOutput i AVCaptureMovieFileOutput
- 19. Jednoczesne przyciśnięcie git & tagi
- 20. Jednoczesne żądania CasperJS
- 21. Jednoczesne naprawy powodują zawieszenie
- 22. Jednoczesne połączenie do rozmowy
- 23. Zagnieżdżone jednoczesne przewijanie UIScrollViews
- 24. Zapisywanie obrazu PHP Po pomyślnym przetworzeniu obrazu:
- 25. Zapisywanie pliku za pomocą curl i PHP
- 26. Zapisywanie odpowiedzi zwijania w zmienną php
- 27. Rekursywne wyszukiwanie plików (PHP)
- 28. PHP SOAP Transfer plików
- 29. Przesyłanie plików dużych plików PHP/AJAX
- 30. Jednoczesne nagrywanie i odtwarzanie dźwięku
Dokładnie to, czego szukałem! To było takie proste, powinienem był sprawdzić dokumentację PHP więcej. –
Należy zachować ostrożność, używając funkcji flock(), ponieważ funkcja nie jest atomowa. – arul
Kolejna wskazówka, aby zapobiec opróżnieniu zawartości pliku na dwóch dokładnie równoczesnych zapisach. Zdarzyło mi się to bardzo często na jednej popularnej stronie z licznikiem odwiedzanych plików. Rozwiązanie: Dodałem losowe opóźnienie 20-80 ms przed fwrite(), i to naprawiło problem, nawet do tej pory ze znacznie większą liczbą odwiedzających. –