Pełną listę funkcji znajdziecie w dokumentacji PHP – funkcje systemu plików, poniżej najczęściej wykorzystywane.
Operacje na plikach w PHP mają podobną formę jak w C.
Zapisywanie danych w pliku następuje w 3 etapach:
- Otwieramy plik lub go tworzymy
- Zapisujemy dane w pliku
- Zamykamy plik
Odczytywanie danych z pliku również przebiega 3-etapowo:
- Otwieramy plik, a jeżeli takowy nie może zostać otwarty musi zostać oprogramowane zgłoszenie błędu
- Odczytujemy dane
- Zamykamy plik
SPRAWDZAMY CZY PLIK ISTNIEJE
file_exists()
Funkcja sprawdza czy plik lub katalog istnieje.
if (file_exists("plik.txt")) echo "plik istnieje";
OTWIERANIE PLIKU
fopen(nazwa_pliku, tryb otwierania);
Przykład:
//instrukcja otwierająca plik, dobrą praktyką jest od razu przypisywanie do zmiennej
$plik=fopen("plik.txt", "w") or die("Nie udało się utworzyć pliku");
- nazwa pliku – musimy pamiętać o ścieżce dostępu do naszego pliku, jeżeli tryb otwierania jest ustawiony na ”r” czyli tylko do odczytu, to za nazwę pliku może służyć adres URL do pliku. Należy uważać, by nie stworzyć pliku o nazwie, która już istnieje – istniejący plik zostanie wtedy trwale usunięty w miejsce nowo stworzonego.
- tryb otwierania:
| ”r” | Otwiera tylko do odczytu; umieszcza wskaźnik pliku na jego początku. |
| ”r+” | Otwiera do odczytu i zapisu; umieszcza wskaźnik pliku na jego początku. |
| ”w” | Otwiera tylko do zapisu; umieszcza wskaźnik pliku na jego początku i obcina plik do zerowej długości. Jeśli plik nie istnieje to próbuje go utworzyć. |
| ”w+” | Otwiera do odczytu i zapisu; umieszcza wskaźnik pliku na jego początku i obcina plik do zerowej długości. Jeśli plik nie istnieje to próbuje go utworzyć. |
| ”a” | Otwiera tylko do zapisu; umieszcza wskaźnik pliku na jego końcu. Jeśli plik nie istnieje to próbuje go utworzyć. |
| ”a+” | Otwiera do odczytu i zapisu; umieszcza wskaźnik pliku na jego końcu. Jeśli plik nie istnieje to próbuje go utworzyć. |
| ”x” | Tworzy i otwiera plik tylko do zapisu; umieszcza wskaźnik pliku na jego początku. Jeśli plik juz istnieje, wywołanie fopen() nie powiedzie się, zwróci FALSE i wygeneruje błąd na poziomie E_WARNING. Jeśli plik nie istnieje, spróbuje go utworzyć. To jest równoważne z określeniem flag O_EXCL|O_CREAT stosowanym w wywołaniu systemowym open(2). |
| ”x+” | Tworzy i otwiera plik odczytu i zapisu; umieszcza wskaźnik pliku na jego początku. Jeśli plik juz istnieje, wywołanie fopen() nie powiedzie się, zwróci FALSE i wygeneruje błąd na poziomie E_WARNING. Jeśli plik nie istnieje, spróbuje go utworzyć. To jest równoważne z okresleniem flag O_EXCL|O_CREAT stosowanym w wywołaniu systemowym open(2). |
ZAPISYWANIE DO PLIKU
fwrite($uchwyt, $tresc);
Powyższa funkcja zapisuje do pliku tekst, zawarty w zmiennej $tresc. Podczas wywołania funkcji można dodać trzeci, opcjonalny argument, $dlugosc. Jeżeli go zamieścimy, do pliku zostanie zapisanych maksymalnie $dlugosc znaków. Zależnie od trybu otwarcia, zawartość zostanie dopisana na końcu pliku, lub nadpisze istniejącą treść. Jest ona równoważna z instrukcją fputs().
// otwieramy plik w trybie umożliwiającym zapis na końcu pliku
$plik=fopen("plik.txt", "a") or die("Nie udało się utworzyć pliku");
// przypisanie zawartości do zmiennej
$zawartosc = "Przykładowa treść, którą umieścimy w pliku.";
fwrite($plik, $zawartosc) or die("Nie udało się zapisać danych w pliku");
Poniżej przykład z użyciem limitu znaków:
// otwieramy plik w trybie umożliwiającym zapis na końcu pliku
$plik=fopen("plik.txt", "a") or die("Nie udało się utworzyć pliku");
// przypisanie zawartości do zmiennej
$zawartosc = "Przykładowa treść, którą umieścimy w pliku. ";
// zwróć uwagę jak łączymy zmienne z treścią do zapisania w pliku
$zawartosc .= "Utniemy ciąg po 30 znakach.";
fwrite($plik, $zawartosc, 30) or die("Nie udało się zapisać danych w pliku");
ODCZYTYWANIE PLIKU
Istnieje kilka sposobów na odczytanie zawartości pliku.
fread($uchwyt, $długość)
Funkcja czyta z pliku określoną długość znaków. Czytanie zakończy się, jeżeli osiągnięta zostanie $dlugość znaków, koniec pliku lub odczytanych zostanie 8192 bajtów. Długość całego pliku możemy określić za pomocą funkcji filesize(„nazwa_pliku.txt”)
Przykład:
// otwieramy plik w trybie umożliwiającym zapis na końcu pliku
$plik=fopen("plik.txt", "r");
// przypisanie zawartości do zmiennej
$zawartosc = fread($plik, 8192); //lub zamiast 8192 używamy filesize("plik.txt")
echo $zawartosc;
fgets($uchwyt)
Innym sposobem na czytanie zawartości jest funkcja . Czyta ona jedną linię pliku, dopóki nie napotka znacznika przejścia do kolejnej linii. Żeby odczytać cały plik, wystarczy użyć pętli. W przypadku tej metody nie musimy się martwić, czy cały plik zostanie odczytany, czy przypadkiem nie przekroczyliśmy długości znaków. Funkcja feof() zwraca true, jeśli osiągnęliśmy koniec pliku. Przykład czytania pliku z użyciem fgets:
// utworzenie uchwytu do pliku
$plik = fopen('index.html','r');
$zawartosc = '';
// przypisanie zawartości do zmiennej
while(!feof($plik))
{
$linia = fgets($plik);
$zawartosc .= $linia;
}
echo $zawartosc;
fgetc($plik)
jest bardzo podobna w użyciu do fgets, z tą jednak różnicą, że czytamy po jednym znaku. Przykład niemal identyczny:
// utworzenie uchwytu do pliku
$plik = fopen('index.html','r');
$zawartosc = '';
// przypisanie zawartości do zmiennej
while(!feof($plik))
{
$linia = fgetc($plik);
$zawartosc .= $linia;
}
echo $zawartosc;
UWAGA: jeżeli kursor znajduje się na końcu pliku, to żeby odczytać dane należy przenieść kursor na początek: rewind(„nazwa_pliku.txt”)
BLOKOWANIE DOSTĘPU DO PLIKU
Blokowanie plików ważnym zagadnieniem w kontekście operacji na plikach. Jeśli wiele osób jednocześnie wchodzi na stronę i plik jest zapisywany (np. licznik), może dojść do nadpisania danych.
Dlatego używamy blokad – flock()
Tryby blokad:
-
LOCK_SH– blokada współdzielona (tylko odczyt, wielu jednocześnie) -
LOCK_EX– blokada wyłączna (zapis, tylko jeden w danym momencie) -
LOCK_UN– zwolnienie blokady
<?php
$plik = 'licznik.txt';
// jeśli plik nie istnieje, utwórz go z zerem
if (!file_exists($plik)) {
file_put_contents($plik, "0");
}
$fp = fopen($plik, 'r+'); // tryb: odczyt + zapis
flock($fp, LOCK_EX); // blokada wyłączna
$liczba = (int)fread($fp, filesize($plik)); // odczytaj aktualną wartość
$liczba++; // zwiększ licznik
rewind($fp); // cofnij wskaźnik na początek pliku
fwrite($fp, $liczba); // zapisz nową wartość
fflush($fp); // zapisz bufor na dysk
flock($fp, LOCK_UN); // zwolnij blokadę
fclose($fp);
echo "Liczba odwiedzin: $liczba";
?>
Dlaczego flock() jest ważny:
Bez niego kilku użytkowników jednocześnie mogłoby odczytać tę samą wartość i zapisać ją, przez co licznik „zgubiłby” odwiedziny.
ZAMYKANIE UCHWYTU DO PLIKU
fclose(nazwa_pliku);
USUWANIE PLIKU
unlink(nazwa_pliku);
Przykład:
// instrukcja otwierająca plik
$uchwyt = fopen("plik.txt", "w");
// usunięcie pliku
unlink("plik.txt");
Nie każdy plik może zostać usunięty, wszystko zależy od odpowiednich praw dostępu.
KOPIOWANIE PLIKÓW
copy(źródło, destynacja);
Pozwala utworzyć duplikat pliku w nowej lokalizacji.
Przykład:
<?php
$src = 'dane.txt';
$dst = 'kopia_dane.txt';
if (copy($src, $dst)) {
echo "Plik został skopiowany do $dst";
} else {
echo "Błąd podczas kopiowania.";
}
?>
Jeśli plik docelowy istnieje — zostanie nadpisany.
PRZENOSZENIE I ZMIANA NAZWY
rename();
Ta funkcja zmienia nazwę pliku lub przenosi go do innego katalogu.
Przykład:
<?php
// zmiana nazwy
rename('kopia_dane.txt', 'dane_kopia_stara.txt');
// przenoszenie do katalogu "archiwum"
rename('dane.txt', 'archiwum/dane.txt');
?>
Działa także dla katalogów.
Przykład
Zapis i odczyt danych do/z pliku
<?php
$dane_do_zapisu = "Przykładowa treść";
$plik = fopen("nazwa_pliku.txt", "a+");// uchwyt pliku, otwarcie do dopisania
flock($plik, 2); // blokada pliku do zapisu
fwrite($plik, "$dane_do_zapisu\n"); // zapisanie danych do pliku
rewind($plik);
$zawartosc = fread($plik, filesize("nazwa_pliku.txt"));
flock($plik, 3); // odblokowanie pliku
fclose($plik); // zamknięcie pliku
echo nl2br($zawartosc); //zmieniamy \n na <br>
?>
Alternatywne podejście
Trzeba pamiętać, że funkcja fopen() daje większą kontrolę i lepiej sprawdza się w „poważniejszych” zastosowaniach (duże dane, blokady, odczyt/zapis równocześnie). Istnieje dla niej prostsza alternatywa.
W PHP najprostszy i najszybszy sposób zapisu danych do pliku to użycie funkcji file_put_contents().
<?php
$dane = "To jest przykładowy tekst.";
file_put_contents("plik.txt", $dane);
?>
- tworzy plik plik.txt (jeśli nie istnieje),
- zapisuje w nim zawartość zmiennej $dane,
- jeśli plik już istnieje — nadpisze go.
Dopisywanie do istniejącego pliku (zamiast nadpisywania):
Użycie flagi FILE_APPEND:
<?php
$dane = "Nowa linia\n";
file_put_contents("plik.txt", $dane, FILE_APPEND);
?>
Wtedy kolejne wywołania dopisują treść na końcu pliku.
Zalety file_put_contents:
-
działa w jednej linijce,
-
nie trzeba otwierać i zamykać pliku ręcznie (jak przy fopen/fwrite),
-
bardzo szybkie i czytelne
Zadanie podsumowujące z formularzem
Zapis, odczyt i usuwanie pliku zawierającego przesłane dane z formularza.
Poniższe pliki należy umieścić w jednym folderze.
index.php
<?php
/*********************************************
* plik zapisujący dane z formularza
*********************************************/
if(empty($_POST['pole1']) and empty($_POST['pole2']))
{
// prosty formularz zawierający dwa pola
echo '<form action="" method="post"> <input type="text" name="pole1" style="width: 200px;" />
<br /> <textarea name="pole2" style="width: 200px; height: 100px;"> </textarea><br />
<input type="submit" value="Zapisz" /> </form>';
}
else
{
$pole1 = trim($_POST['pole1']);
$pole2 = trim($_POST['pole2']);
$dane = $pole1."`".$pole2."\n"; // dane pochodzące z formularza
$file = "baza.txt"; // przypisanie zmiennej $file nazwy pliku
$fp = fopen($file, "a");// uchwyt pliku, otwarcie do dopisania
flock($fp, 2); // blokada pliku do zapisu
fwrite($fp, $dane); // zapisanie danych do pliku
flock($fp, 3); // odblokowanie pliku
fclose($fp); // zamknięcie pliku
echo "Dane zostały zapisane!<br />";
echo "<a href=\"podglad.php\">Zobacz wpisane dane</a>";
}
?>
podglad.php
<?php
/*********************************************
* plik podglad.php
*********************************************/
$file = file("baza.txt"); // wczytanie zawartości pliku do tablicy
foreach($file as $value) // przechodzimy przez tablicę za pomocą pętli foreach
{
$exp = explode("`",$value);// rozbijamy poszczególne linie na części
echo $exp[0]."<br />".$exp[1]."<hr />";// wyświetlamy rozbity tekst
}
echo "<a href=\"index.php\">Dodaj kolejne dane </a>
<br>
<a href=\"del.php\"> Usuń plik</a>";
?>
del.php
<?php
// usunięcie pliku
unlink("baza.txt");
echo "<a href=\"index.php\">Dodaj dane</a><br><br>";
echo "Plik został usunięty";
?>
Zadania do wykonania:
Zadanie 1: Napisz skrypt PHP, który:
-
Generuje 20 losowych liczb całkowitych z zakresu 1–100.
-
Zapisuje je do pliku
liczby.txt, każdą w nowej linii, zastosuj 3 etapowy sposób zapisu oraz dodaj/zdejmij blokadę do zapisu przez więcej niż 1 osobę na raz. -
Następnie odczytuje zawartość pliku i:
-
wyświetla wszystkie zapisane liczby,
-
oblicza i wypisuje:
-
sumę liczb,
-
średnią,
-
największą i najmniejszą wartość,
-
liczbę liczb parzystych i nieparzystych.
-
-
-
Dodaj drugi plik
statystyki.txt, do którego skrypt dopisuje podsumowanie w formacie:
Zadanie 2: Napisz skrypt, który wykorzystując file_put_contents():
- Generuje 6 losowych liczb całkowitych z zakresu 1–49 i umieszcza je w tablicy.
- Pobiera aktualną datę w formacie 'd-m-Y H:i:s’.
- Zapisuje dane do pliku
liczby.txt, każdy wpis w nowej linii, w formacie:
<aktualna_data> wylosowano liczby: <liczby_z_tablicy>.
- Następnie odczytuje zawartość pliku