Poprawna odpowiedź to fwrite(), ponieważ jest to podstawowa funkcja PHP służąca do zapisu danych do pliku. W typowym scenariuszu najpierw otwierasz plik funkcją fopen(), np. w trybie 'w' (zapis, nadpisanie) albo 'a' (dopisywanie na koniec), a dopiero potem używasz fwrite($uchwyt, $dane). Taki schemat: $fp = fopen('log.txt', 'a'); fwrite($fp, "Nowy wpis\n"); fclose($fp); to w praktyce standardowy wzorzec pracy z plikami w PHP. Moim zdaniem warto od początku wyrabiać sobie nawyk sprawdzania, czy fopen() się udało (czy nie zwróciło false) oraz czy fwrite() nie zwróciło 0 lub false, bo to jedna z podstawowych dobrych praktyk w programowaniu webowym. W kontekście aplikacji internetowych fwrite() często wykorzystuje się do zapisywania logów (np. własny prosty system logowania błędów), przechowywania prostych danych konfiguracyjnych, cache’owania wygenerowanych stron HTML do plików statycznych, a nawet do eksportu danych do plików CSV. W realnych projektach PHP zapis do pliku trzeba łączyć z odpowiednimi uprawnieniami katalogów na serwerze oraz z kontrolą błędów, żeby aplikacja zachowywała się przewidywalnie nawet wtedy, gdy system plików odmawia zapisu. Dobre praktyki mówią też, żeby nie mieszać logiki aplikacji z zapisem do pliku w losowych miejscach kodu, tylko wydzielić osobne funkcje lub klasy (np. Logger, FileStorage). fwrite() jest wtedy używane pod spodem, a reszta aplikacji tylko woła te wyższe warstwy. Warto też pamiętać o kodowaniu znaków (UTF-8) i o tym, żeby przy danych binarnych (np. obrazki, PDF-y) otwierać plik w trybie 'wb' lub 'ab'. To niby drobiazgi, ale w praktyce często decydują o tym, czy program działa stabilnie na różnych serwerach i systemach operacyjnych.
W tym pytaniu chodzi konkretnie o funkcję, która służy do zapisu danych do pliku, a nie tylko do jego odczytu. W PHP operacje na plikach są dość podobne do tego, co spotyka się w innych językach, ale łatwo się pomylić, bo nazwy funkcji są zbliżone i wszystkie kręcą się wokół plików. Z mojego doświadczenia często pojawia się takie myślenie: skoro funkcja działa na pliku, to pewnie można jej użyć „do wszystkiego”. Niestety tak to nie działa. Przykładowo fgets() służy do odczytywania pojedynczej linii z pliku. Używa się jej najczęściej w pętli, żeby czytać plik linia po linii, np. przy przetwarzaniu plików tekstowych lub logów. Funkcja ta pobiera dane z pliku do pamięci programu, ale niczego nie zapisuje z powrotem. Dlatego wybór jej jako odpowiedzi sugeruje pomylenie kierunku operacji: zamiast myślenia „chcę zapisać”, jest myślenie „chcę coś zrobić z plikiem” – za mało precyzyjne jak na programistę. Podobnie fread() też zajmuje się wyłącznie odczytem, tyle że w sposób bardziej ogólny: czyta określoną liczbę bajtów z pliku. To świetne narzędzie, gdy potrzebujemy wczytać cały plik binarny albo większy fragment danych. Nadal jednak jest to tylko odczyt. Jeśli ktoś wybiera tę funkcję, zwykle wynika to z tego, że kojarzy ją jako „główne API do plików”, ale nie zwraca uwagi na to, że nazwa zawiera „read”, czyli czytanie. readfile() to jeszcze inna historia: ta funkcja czyta plik i natychmiast wysyła jego zawartość do wyjścia (najczęściej do przeglądarki). Używa się jej przy serwowaniu statycznych plików, pobieraniu załączników, prostych mechanizmach downloadu. Ona w ogóle niczego nie zapisuje do pliku, tylko „czyta i wypluwa”. Wybór tej funkcji często wynika z intuicji, że skoro coś „robi z plikiem” i jest wygodne, to może też służyć do zapisu. Niestety, nie. Merytorycznie wszystkie te funkcje działają tylko w jednym kierunku: z pliku do programu (lub do przeglądarki). Do zapisu potrzebna jest funkcja, która bierze dane z programu i umieszcza je w pliku, i właśnie tym zajmuje się fwrite(). Rozróżnianie funkcji odczytu i zapisu to podstawa pracy z plikami w PHP i w ogóle w programowaniu webowym, bo od tego zależy, czy dane naprawdę zostaną zapisane na serwerze, czy tylko gdzieś chwilowo w pamięci.