Fopen()

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

fopen() - Otwiera plik lub URL

składnia

resource fopen ( string nazwa_pliku, string tryb [, bool użyj_include_path [, resource zkontekst]] )

Opis

fopen() wiąże nazwany zasób, określony przez przez nazwa_pliku do strumienia. Jeśli nazwa_pliku jest w formacie "schemat://...", PHP przyjmuje, że to jest URL i rozpoczyna poszukiwanie programu obsługi protokołu (również zwanego wrapperem) dla tego schematu. Jeśli nie ma zarejestrowanego wrappera dla tego protokołu, PHP wyświetli wiadomość, aby pomóc namierzyć potencjalne problemy w Twoim skrypcie i będzie kontynuować pracę, traktując podany nazwa_pliku jako zwykły plik.

Jeśli PHP zdecyduje, że nazwa_pliku określa lokalny plik, wtedy spróbuje otworzyć strumień na tym pliku. Plik musi być dostępny dla PHP, musisz więc zapewnić prawa dostępu do pliku pozwalające na taką operację. Jeśli masz włączone tryb bezpieczny lub open_basedir mogą mieć zastosowanie dodatkowe restrykcje.

Jeśli PHP zdecyduje, że nazwa_pliku określa zarejestrowany protokół i ten protokół jest zarejestrowany jako sieciowy URL, PHP sprawdzi allow_url_fopen czy jest włączone. Jeśli jest wyłączone (off), PHP wyświetli ostrzeżenie i wywołanie fopen zakończy się niepowodzeniem.

Notatka: Od PHP 4.3.2 domyślny tryb ustawiany jest na binarny, dla wszystkich platform, które rozróżniają tryby binarne i tekstowe. Jeśli masz problemy ze skryptem po aktualizacji, spróbuj użyć flagi 't' jako obejście dopóki nie uczynisz Twojego skryptu bardziej przenośnym jak opisano niżej.

Lista możliwych trybów dla fopen()

Parametr tryb określa rodzaj dostępu jaki wymagasz do strumienia. Może być dowolny z następujących:

tryb Opis
'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 już 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ć. Ta opcja jest obsługiwana w PHP 4.3.2 i późniejszych i działa tylko na plikach lokalnych.
'x+' Tworzy i otwiera plik odczytu i zapisu; umieszcza wskaźnik pliku na jego początku. Jeśli plik już 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ć. Ta opcja jest obsługiwana w PHP 4.3.2 i późniejszych i działa tylko na plikach lokalnych.

Znaki końca linii

różne rodziny systemów operacyjnych stosują różne konwencje końca linii. Kiedy zapisujesz plik tekstowy i chcesz wstawić łamanie linii, musisz użyć poprawnych dla twojego systemu operacyjnego znak(ów) końca linii. Systemy bazujące na Uniksie używają \n jako znaku końca linii, systemy bazujące na Windowsie używają \r\n jako znaków końca linii, a systemy Macintosh używają \r jako znak końca linii.

Jeśli użyjesz nieprawidłowego końca linii do zapisu pliku, możesz zaobserwować, w innych aplikacjach otwierając ten plik, że "wygląda on zabawnie".

Windows oferuje flagę ('t') konwertującą tryb tekstowy, która przezroczyście przekłada \n na \r\n kiedy pracujesz z plikiem. Dla kontrastu, możesz także użyć 'b' aby wymusić tryb binarny, wtedy nie będzie konwertować twoich danych. Aby użyć tych flag, wstaw 'b' lub 't' jako ostatni znak w parametrze tryb .

Domyślnie tryb konwersji zależy od SAPI i wersji PHP jakiej używasz, więc namawiamy aby zawsze podawać stosowną flagę w celu przenośności. Powinieneś użyć trybu 't' jeśli pracujesz ze zwykłymi plikami tekstowymi (plain-text)i używasz \n do ograniczenia końców linii w twoim skrypcie, ale wymagasz aby twój plik był czytelny w aplikacjach takich jak notatnik. Powinieneś użyć 'b' w każdym innym przypadku.

Jeśli nie podasz flagi 'b' kiedy pracujesz na binarnych plikach, możesz doświadczyć dziwnych problemów z twoimi danymi, włączając uszkodzone pliki graficzne i dziwne problemy ze znakami \r\n.

Dla przenośności, bardzo zalecane jest użycie zawsze flagi 'b' kiedy otwierasz pliki za pomocą fopen().

Ponownie, dla przenośności, jest również bardzo zalecane abyś, przepisał swój kod, który używa lub polega na trybie 't' tak aby używał poprawnego końca linii oraz trybu 'b'.

Opcjonalny trzeci parametr użyj_include_path może być ustawiony na '1' lub TRUE jeśli chcesz szukać pliku także w include_path.

Jeśli otwieranie się nie powiedzie, funkcja zwróci FALSE i wygenerowany zostanie błąd na poziomie E_WARNING. Możesz użyć @ aby zatuszować to ostrzeżenie.

przykłady

<?php
$handle = fopen("/home/rasmus/plik.txt", "r");
$handle = fopen("/home/rasmus/plik.gif", "wb");
$handle = fopen("http://www.przykład.com/", "r");
$handle = fopen("ftp://uzytkownik:haslo@przykład.com/jakisplik.txt", "w");
?>

Jeśli doświadczasz problemów z odczytem lub zapisywaniem do plików i używasz PHP w postaci modułu serwera, pamiętaj, żeby się upewnić, że pliki i katalogi, których używasz są dostępne dla procesu serwera.

Na platformie Windows, dbaj aby wstawiać znaki ucieczki (escape) przed wszystkimi lewymi ukośnikami (backslash) użytymi w ścieżce do pliku lub używać ukośników (slash).

<?php
$handle = fopen("c:\\data\\info.txt", "r");
?>


Notatka: Kiedy włączony jest tryb bezpieczny, PHP sprawdza czy katalog, na którym chcesz operować, ma takie same UID (owner) jak skrypt, który jest aktualnie wykonywany.

Patrz także