Problem jest dobrze znany przy licznikach odwiedzin, które lubią się resetować. Chcę zabezpieczyć skrypt sondy. Jest kilka plików: log.php, glosy.php... Jakich metod użyć?
Przykładowy zapis wygląda tak:
1. Odczytaj plik glosy.php za pomocą include()
2. Odczytaj plik log.php za pomocą include()
3. Zmień wartości w tablicach odczytanych z plików glosy.php i log.php
4. Zapisz plik log.php za pomocą file_put_contents() albo fwrite()
5. Zapisz plik glosy.php za pomocą file_put_contents() albo fwrite()
Hipoteza resetów liczników odwiedzin
1. Żądanie A odczytuje zawartość z pliku, zwiększa i zapisuje za pomocą file_put_contents()
2. W tym samym czasie żądanie B odczytuje zawartość pliku - być może jest wymazana
3. Żądanie B zwiększa pustą wartość i zapisze "1" do pliku
Jak się przed tym zabezpieczyć? Jest kilka sugestii:
1. Blokować dostęp zarówno do zapisu i do odczytu przy file_put_contents()
2. Sprawdzać is_writable() i is_readable() i dopiero include()
3. Po include() sprawdzić, czy istnieje tablica (która tam ma być) i nie jest pusta
4. Zapisywać do plików tymczasowych (np. glosy_new.txt), a następnie rename() do glosy.txt
5. Inny sposób - jaki jest na 100% skuteczny?
Jaki macie skuteczny sposób na hazard podczas odczytu i zapisu plików?