Práce se soubory v PHP. Čtení souboru, zápis do souboru

$Vdata = file_get_contents("textfile.txt");

Ale teď musím načíst soubor PHP.

Předpokládám, že chcete získat Obsah generovaný PHP, pokud je to pravda:

$Vdata = file_get_contents("http://VÁŠ_HOST/VÁŠ/SOUBOR.php");

V opačném případě, pokud chcete získat Zdrojový kód souboru PHP, je to stejné jako soubor .txt:

$Vdata = file_get_contents("cesta/k/VAŠEMU/SOUBORU.php");

Ob_start(); zahrnout "vassoubor.php"; $myvar = ob_get_clean();

Pokud používáte http:// jak navrhuje eyel, budete moci číst pouze výstup skriptu PHP. PHP skript můžete číst, pouze pokud je na stejném serveru jako váš skript. Pak můžete použít něco jako

$Vdata = file_get_contents("/cesta/k/vasimu/souboru.php");

Pokud chcete stáhnout soubor, aniž byste jej spouštěli přes webový server, mělo by fungovat následující.

$string = eval(file_get_contents("soubor.php"));

Poté bude stažen obsah souboru. Soubor PHP musí být plně vytvořen pomocí značekAby to eval vyhodnotil.

Teoreticky můžete použít fopen a poté použít stream_get_contents.

$stream = fopen("soubor.php","r"); $string = stream_get_contents($stream); fclose($stream);

Případně můžete spustit ukládání do vyrovnávací paměti výstupu, zahrnout/vyžadovat a pak ukládání do vyrovnávací paměti zastavit. Pomocí ob_get_contents() můžete jednoduše dostat věci, které byly na výstupu jiného souboru PHP, do proměnné.

file_get_contents() nebude fungovat, pokud váš server zakázáno allow_url_fopen. Většina sdílených webových hostitelů je ve výchozím nastavení zakázána kvůli bezpečnostním rizikům. Kromě toho v PHP6 volba allow_url_fopen již nebude existovat a všechny funkce budou fungovat, jako by byly trvale deaktivovány. Takže to je velmi špatná metoda k použití.

Váš nejlepší případ použití, pokud přistupujete k souboru přes http, je cURL

Před pokusem o práci se souborem je vhodné se ujistit, že soubor existuje. K vyřešení tohoto problému se obvykle používají dvě funkce:

file_exists() a is_file().

Funkce file_exists() zkontroluje, zda daný soubor existuje. Pokud soubor existuje, funkce vrátí hodnotu TRUE, jinak vrátí hodnotu FALSE. Syntaxe funkce file_exists() je:

bool file_exists (řetězcový soubor)

Příklad kontroly existence souboru:

if (!file_exists($filename)) :

print "Soubor $filename neexistuje!";

is_file()

Funkce is_file() kontroluje existenci daného souboru a zda jej lze číst/zapisovat. Is_file() je v podstatě robustnější verze file_exists(), která kontroluje nejen to, zda soubor existuje, ale také zda může číst a zapisovat data:

bool is_file(řetězcový soubor)

Následující příklad ukazuje, jak ověřit, že soubor existuje a že s ním lze provádět operace:

$soubor = "nejaky soubor.txt";

if (je_soubor($soubor)) :

print "Soubor $file je platný a existuje!";

print "Soubor $file neexistuje nebo to není platný soubor!";

Poté, co se ujistíte, že požadovaný soubor existuje a že s ním lze provádět různé operace čtení/zápisu, můžete přistoupit k dalšímu kroku – otevření souboru.

Funkce filesize() vrací velikost (v bajtech) souboru s daným názvem nebo FALSE při chybě. Syntaxe funkce Filesize():

int velikost souboru (řetězec názvu souboru)

Řekněme, že chcete určit velikost souboru pastry.txt. Chcete-li získat potřebné informace, můžete použít funkci filesize():

$fs = velikost souboru("pečivo.txt"); print "Pečivo.txt je $fs bajtů.";

Zobrazí se následující výsledek:

Pastry.txt má 179 bajtů.

Než budete moci provádět operace se souborem, musíte jej otevřít a spojit s obslužnou rutinou souboru a poté, co se souborem skončíte, jej musíte zavřít. Tato témata jsou popsána v další části.

Otevírání a zavírání souborů

Než budete moci provést vstup/výstup na souboru, musíte jej otevřít pomocí fopen().

Funkce fopen() otevře soubor (pokud existuje) a vrátí celé číslo -- volané manipulátor souborů(popisovač souboru). syntaxe funkce fopen():

int fopen (řetězcový soubor, režim řetězce [, int enable_path])

Otevíraný soubor může být v místním systému souborů, může existovat jako standardní vstupní/výstupní proud nebo může představovat soubor na vzdáleném systému akceptovaný přes HTTP nebo FTP.

Parametr souboru lze zadat v několika formách, uvedených níže:

Pokud parametr obsahuje název místního souboru, fopen() otevře tento soubor a vrátí popisovač.

Pokud je parametr zadán jako php://stdin, php://stdout nebo php://stderr, otevře se odpovídající standardní vstupní/výstupní proud.

Pokud parametr začíná předponou http://, funkce otevře připojení HTTP k serveru a vrátí popisovač zadaného souboru.

Pokud parametr začíná předponou ftp://, funkce otevře FTP připojení k serveru a vrátí popisovač zadaného souboru. V tomto případě je třeba věnovat zvláštní pozornost dvěma věcem: Pokud server nepodporuje pasivní režim FTP, volání fopen() se nezdaří. Kromě toho se soubory FTP otevírají buď pro čtení nebo zápis.

Při provozu v pasivním režimu čeká server YAR na připojení od klientů. Při provozu v aktivním režimu server sám naváže spojení s klientem. Výchozí nastavení je obvykle aktivní režim.

Parametr mode určuje schopnost číst a zapisovat do souboru. V tabulce 7.1 uvádí některé hodnoty, které určují režim otevírání souborů.

Tabulka 7.1. Režimy otevírání souborů

Režim Popis
Pouze čtení. Ukazatel aktuální pozice je nastaven na začátek souboru
r+ Číst a psát. Ukazatel aktuální pozice je nastaven na začátek souboru
w Pouze nahrávání. Aktuální ukazatel pozice je nastaven na začátek souboru a celý obsah souboru je zničen. Pokud soubor neexistuje, funkce se jej pokusí vytvořit
w+ Číst a psát. Aktuální ukazatel pozice je nastaven na začátek souboru a celý obsah souboru je zničen. Pokud soubor neexistuje, funkce se jej pokusí vytvořit
A Pouze nahrávání. Ukazatel aktuální polohy je nastaven na konec souboru. Pokud soubor neexistuje, funkce se jej pokusí vytvořit
a+ Číst a psát. Ukazatel aktuální pozice je nastaven na konec souboru. Pokud soubor neexistuje, funkce se jej pokusí vytvořit

Pokud je volitelný třetí parametr include_path 1, pak je cesta k souboru relativní k adresáři include zadanému v souboru php.ini (viz kapitola 1).

Níže je uveden příklad otevření souboru pomocí funkce fopen(). Volání die() používané ve spojení s fopen() poskytuje chybovou zprávu, pokud soubor nelze otevřít:

$file = "userdata.txt"; // Nějaký soubor

$fh = fopen($soubor, "a+") or die("Soubor ($soubor) neexistuje!");

Následující fragment otevře připojení k webu PHP (http://www.php.net):

$site = "http://www.php.net": // Server přístupný přes HTTP

$sh = fopen($site., "r"); //Přiřaďte manipulátor k indexové stránce Php.net

Po dokončení práce by měl být soubor vždy uzavřen pomocí fclose().

Funkce fclose() zavře soubor s daným manipulátorem. Pokud je uzavření úspěšné, je vrácena hodnota TRUE; syntaxe funkce fclose():

int fclose (manipulátor int)

Funkce fclose() úspěšně zavře pouze ty soubory, které byly dříve otevřeny funkcemi fopen() nebo fsockopen(). Příklad uzavření souboru:

$soubor = "userdata.txt";

if (file_exists($file)) :

$fh = fopen($soubor, "r");

// Provádění operací se soubory

tisknout "Soubor soubor neexistuje!";

Zapsat do souboru

S otevřenými soubory se provádějí dvě hlavní operace: čtení a zápis.

Funkce is_writeable() ověřuje, že soubor existuje a je možné do něj zapisovat. Možnost zápisu se kontroluje jak pro soubor, tak pro adresář. Syntaxe funkce is_writeable() je:

bool is_writeable (řetězcový soubor)

Jedna důležitá věc, kterou je třeba poznamenat, je, že PHP bude s největší pravděpodobností běžet pod uživatelským ID používaným webovým serverem (obvykle „nikdo“). Příklad použití is_writeable() je uveden v popisu funkce fwrite().

Funkce fwrite() zapíše obsah řetězcové proměnné do souboru určeného obslužnou rutinou souboru. syntaxe funkce fwrite():

int fwrite(manipulátor int, proměnná řetězce [, délka int])

Pokud je při volání funkce předán volitelný parametr length, zápis se zastaví buď po zapsání zadaného počtu znaků, nebo po dosažení konce řádku. Kontrola, zda lze do souboru zapisovat, je ukázána v následujícím příkladu:

// Informace o provozu na webu uživatele

$data = "08:13:00|12:37:12|208.247.106.187|Win98";

$filename = "nejaky soubor.txt";

// Pokud soubor existuje a lze do něj zapisovat

if (is_writeable($filename)) :

$fh = fopen($název souboru, "a+");

// Zapíše obsah $data do souboru

$ úspěch - fwrite($fh, $data);

// Zavřít soubor

fclose($fh); jiný:

print "Nelze otevřít Sfilename pro zápis";

Funkce fputs() je alias pro fwrite() a lze ji použít kdekoli, kde se používá fwrite().

Funkce fputs() je alias pro fwrite() a má přesně stejnou syntaxi. syntaxe funkce fputs():

int fputs(manipulátor int, proměnná řetězce [, délka int])

Osobně dávám přednost použití fputs(). Je třeba si uvědomit, že jde pouze o stylovou záležitost a nemá to nic společného s rozdíly mezi těmito dvěma funkcemi.

Čtení ze souboru

Čtení je nepochybně nejdůležitější operací prováděnou se soubory. Níže jsou uvedeny některé funkce, které zefektivňují čtení ze souboru. Syntaxe těchto funkcí téměř přesně kopíruje syntaxi podobných záznamových funkcí.

Funkce i s_readable() vám umožňuje ověřit, že soubor existuje a je čitelný. Čitelnost se kontroluje jak pro soubor, tak pro adresář. Syntaxe funkce is_readable() je:

vypískat! is_readable(řetězcový soubor]

PHP s největší pravděpodobností poběží pod uživatelským ID používaným webovým serverem (obvykle „nikdo“), takže aby funkce is_readable() vrátila hodnotu TRUE, musí soubor umožnit čtení všem. Následující příklad ukazuje, jak ověřit, že soubor existuje a je čitelný:

if (is_readable($filename)) :

// Otevřete soubor a nastavte ukazatel aktuální pozice na konec souboru

$fh = fopen($název souboru, "r");

print "$filename není čitelný!";

Funkce fread() čte zadaný počet bajtů ze souboru určeného manipulátorem souborů. syntaxe funkce fwrite():

int fread (manipulátor int, délka int)

Manipulátor se musí odkazovat na otevřený soubor, který je čitelný (viz popis funkce is_readable()). Čtení se zastaví po přečtení zadaného počtu bajtů nebo po dosažení konce souboru. Zvažte textový soubor pastry.txt zobrazený ve výpisu 7.1. Čtení a výstup tohoto souboru v prohlížeči se provádí následujícím fragmentem:

$fh = fopen("pečivo.txt", "r") or die("Soubor nelze otevřít!");

$soubor = fread($fh, velikost souboru($fh));

Použitím funkce fllesize() k určení velikosti pastry.txt v bajtech zajistíte, že funkce fread() přečte celý obsah souboru.

Výpis 7.1. Textový soubor pečivo.txt

Recept: Těsto na pečivo

1 1/4 šálku univerzální mouky

3/4 tyčinky (6 lžic) nesoleného másla, nakrájené

2 lžíce zeleninového tuku 1/4 lžičky soli

3 lžíce vody

Funkce fgetc() vrací řetězec obsahující jeden znak ze souboru na aktuální pozici ukazatele nebo FALSE, když je dosaženo konce souboru. Syntaxe funkce fgetc():

string fgetc (manipulátor int)

Manipulátor musí odkazovat na otevřený soubor, který je čitelný (viz popis funkce is_readable() dříve v této kapitole). Následující příklad ukazuje čtení a výstup souboru znak po znaku pomocí funkce fgetc():

$fh = fopen("pečivo.txt", "r"); while (!feof($fh)) :

$char = fgetc($fh):

tisk $char; na konci;

Funkce fgets() vrací řetězec přečtený z aktuální pozice ukazatele v souboru určeném obslužnou rutinou souboru. Ukazatel souboru musí ukazovat na otevřený soubor, který je čitelný (viz popis funkce is_readable() dříve v této kapitole). syntaxe funkce fgets():

string fgets (manipulátor int, délka int)

Čtení se zastaví, když je splněna jedna z následujících podmínek:

  • číst ze souboru délka -- 1 byte;
  • znak nového řádku byl načten ze souboru (zahrnut do vráceného řetězce);
  • Příznak konce souboru (EOF) byl načten ze souboru.

Pokud chcete organizovat čtení souboru po řádcích, zadejte do druhého parametru hodnotu, která je zjevně větší než počet bajtů v řádku. Příklad řádkového čtení a výstupu souboru:

$fh = fopen("pečivo.txt", "r");

while (!feof($fh));

$line = fgets($fh, 4096);

vytisknout řádek $. "
";

Funkce fgetss() je zcela podobná funkci fgets() s jedinou výjimkou – pokouší se odstranit všechny HTML a PHP tagy z čteného textu:

string fgetss (manipulátor Int, délka int [, řetězec povolených_tagů])

Než přejdete k příkladům, projděte si obsah výpisu 7.2 – tento soubor se používá ve výpisech 7.3 a 7.4.

Výpis 7.2. Soubor science.html

Nejnovější zprávy – věda

Objevena mimozemská forma života


20. srpna 2000

Dnes brzy ráno byla nalezena podivná nová forma houby rostoucí ve skříni staré bytové lednice W. J. Gilmora Není známo, zda tomuto vývoji napomohlo silné záření vycházející z monitoru počítače nájemníka.

Výpis 7.3. Odstranění značek ze souboru HTML před zobrazením v prohlížeči

$fh = fopen("science.html", "r");

while (!feof($fh)) :

tisknout fgetss($fh, 2048);

Výsledek je uveden níže. Jak můžete vidět, ze souboru science.html byly odstraněny všechny značky HTML, což způsobilo ztrátu formátování:

V některých situacích jsou ze souboru odstraněny všechny značky kromě několika – například značky zalomení řádku
. Výpis 7.4 ukazuje, jak se to dělá.

Výpis 7.4. Selektivní odstranění značek ze souboru HTML

$fh = fopenC"science.html", "r");

$povoleno = "
";

while (!feof($fh)) :

tisknout fgetss($fh. 2048, $povoleno);

Výsledek:

Nejnovější zprávy - Věda objevena mimozemská forma života 20. srpna 2000 Dnes brzy ráno byla nalezena podivná nová forma houby rostoucí ve skříni staré ledničky W. J. Gilmora. Není známo, zda tomu pomohlo silné záření vycházející z monitoru počítače nájemníka vývoj.

Jak můžete vidět, funkce fgetss() usnadňuje převod souborů, zvláště když máte velké množství podobně formátovaných souborů HTML.

Čtení souboru do pole

Funkce file() načte celý obsah souboru do indexovatelného pole. Každý prvek pole odpovídá jednomu řádku souboru. Syntaxe funkce File():

soubor pole (string file [, int include_path])

Pokud je volitelný třetí parametr include_path 1, pak je cesta k souboru relativní k adresáři include zadanému v souboru php.ini (viz kapitola 1). Výpis 7.5 používá k načtení souboru pastry.txt funkci file() (viz Výpis 7.1).

$file_array = soubor("pečivo.txt");

while (seznam($line_num. $line) = everyt($file_array)):

tisk " Řádek $line_num:", htmlspecialchars($line), "
\n"

Každý řádek pole je vytištěn spolu s číslem:

Řádek 0: Recept: Těsto na pečivo

Řádek 1: 1 1/4 šálku univerzální mouky

Řádek 2: 3/4 tyčinky (6 lžic) nesoleného másla, nakrájené

3. řádek: 2 lžíce zeleninového tuku

Řádek 4: 1/4 lžičky soli

Řádek 5: 3 lžíce vody

Přesměrování souboru na standardní výstup

Funkce readfile() čte obsah souboru a zapisuje jej na standardní výstup (ve většině případů do prohlížeče). syntaxe funkce readfile():

int readfile (řetězcový soubor [, int include_path])

Funkce vrací počet přečtených bajtů. Soubor se může nacházet v místním systému souborů, může existovat jako standardní vstup/výstup nebo může představovat soubor na vzdáleném systému akceptovaném přes HTTP nebo FTP. Parametr file se nastavuje podle stejných pravidel jako ve funkci fopen().

Řekněme, že máte soubor latorre.txt, jehož obsah chcete zobrazit v prohlížeči:

Restaurace "La Torre." se sídlem v Nettuno, Itálie, nabízí eklektickou směs stylu. historie a skvělá kuchyně z mořských plodů. Ve zdech středověkého borga obklopujícího město můžete stolovat a přitom pozorovat kolemjdoucí nakupující ve vesnických buticích. Pohodlí ve spojení s tím nejčerstvějším mořem dělají z La Torre jednu z nejlepších italských restaurací.

Po provedení následujícího fragmentu se celý obsah souboru latorre.txt odešle na standardní výstup:

$restaurant_file = "latorre.txt";

// Odešle celý soubor na standardní výstup

readfile($soubor_restaurace);

Otevření obslužné rutiny souboru procesu

Spolu s běžnými soubory můžete otevřít manipulátory se soubory pro interakci s procesy na serveru. Problém řeší funkce popen(), která má následující syntaxi:

int popen (řetězcový příkaz, řetězcový režim)

Parametr příkazu určuje systémový příkaz, který se má provést, a parametr mode popisuje režim přístupu:

// Otevřete soubor "spices.txt" pro zápis

$fh = fopen("spices.txt","w");

// Přidejte několik řádků textu

fputs($fh, "petržel, šalvěj, rozmarýn\n");

fputs($fh, "Paprika, sůl, pepř\n");

fputs($fh, "Bazalka, šalvěj, zázvor\n");

// Zavřete manipulátor

// Otevřete unixový proces grep pro vyhledání slova Basil v souboru koření.txt

$fh - popen("grep Basil< spices.txt", "r");

// Vytiskne výsledek grep

Výsledek vypadá takto:

Bazalka, šalvěj, zázvor

Funkce fpassthru() je podobná funkci passthru() popsané v této kapitole v části „Spouštění externích programů“.

Po dokončení všech operací musí být soubor nebo proces uzavřen. Funkce pclose() uzavře spojení s procesem určeným manipulátorem, podobně jako funkce fclose() zavírá soubor otevřený funkcí fopen(). syntaxe funkce pclose():

int pclose (manipulátor int)

V parametru manipulátor manipulátor přijatý dříve s úspěšným voláním popen() je přenesen.

Otevření připojení zásuvky

PHP se neomezuje pouze na interakci se soubory a procesy – můžete také vytvářet připojení prostřednictvím soketů. Zásuvka Soket je softwarová abstrakce, která umožňuje komunikovat s různými službami na jiném počítači.

Funkce fsockopen() vytváří soketové připojení k serveru na internetu

přes protokol TCP nebo UDP. syntaxe funkce fsockopen():

int fsockopen (uzel řetězce, port int [, int kód_chyby [, text_chyby řetězce [, časový limit int]]])

Nepovinné parametry error_code a error_text obsahují informace, které se zobrazí, pokud selže připojení k serveru. Oba parametry musí být předány odkazem. Třetí volitelný parametr, timeout, určuje dobu čekání na odpověď ze serveru (v sekundách). Výpis 7.6 ukazuje použití funkce fsockopen() k získání informací o serveru. Než se však podíváte na výpis 7.6, je tu ještě jedna funkce, kterou potřebujete vědět: socket_set_blocking().

UDP (User Datagram Protocol) je komunikační protokol bez připojení.

socket_set_blocking()

Funkce socket_set_b1ocki ng() vám umožňuje nastavit řízení časového limitu pro operace serveru:

socket_set_blocking (manipulátor int, booleovský režim)

Parametr manipulátor určuje dříve otevřenou zásuvku a parametr mode volí režim, do kterého se zásuvka přepne (TRUE pro blokovací režim, FALSE pro neblokovací režim). Příklad použití funkcí fsockopen() a socket_set_blocking() je uveden ve výpisu 7.6.

Výpis 7.6. Použití fsockopen() k získání informací o serveru

funkce getthehost($host.$path) (

// Otevření připojení k uzlu

$fp - fsockopen($hostitel, 80, &$errno, &$errstr, 30);

// Přejít do režimu blokování

socket_set_blocking($fp, 1),

// Odeslání záhlaví

fputs($fp,"ZÍSKAT $cestu HTTP/1.1\r\n");

fputs($fp, "Hostitel: $hostitel\r\n\r\n"); $x = 1;

// Získání záhlaví

zatímco($x< 10) :

$headers = fgets($fp, 4096);

// Zavřete manipulátor

getthehost("www. apress.com", "/");

Spuštění Výpisu 7.6 vytváří následující výstup:

HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Umístění obsahu:

2000 20:25:06 GMT ETag: "f0a61666dbff1bf1:34a5" Obsah-délka: 1311

Funkce pfsockopen() je trvalou verzí fsockopen(). To znamená, že připojení nebude automaticky ukončeno, když skončí skript, ve kterém byla funkce volána. Syntaxe funkce pfsockopen() je:

int pfsockopen (uzel řetězce, port int [, int kód_chyby [, text_chyby řetězce [, časový limit int]]])

V závislosti na konkrétních cílech vaší aplikace může být pohodlnější použít pfsockopen() místo fsockopen().

Spouštění externích programů

PHP skripty mohou také spouštět programy umístěné na serveru. Tato funkce se využívá zejména při správě systému přes webový prohlížeč a také pro pohodlnější získávání souhrnných informací o systému.

Funkce exec() spustí daný program a vrátí poslední řádek jeho výstupu. Syntaxe funkce exec():

string exec (příkaz string [, pole řetězců [, int return]])

Upozorňujeme, že funkce exec() pouze provede příkaz a nevytiskne jeho výsledky. Veškerý výstup příkazu lze uložit do volitelného parametru pole. Pokud je navíc při zadávání parametru pole zadána návratová proměnná, je tomuto parametru přiřazen návratový kód provedeného příkazu.

Výpis 7.7 ukazuje, jak použít funkci exec() ke spuštění funkce systému UNIX ping.

Výpis 7.7. Kontrola spojení se serverem pomocí funkce exec().

exec("ping -z 5 www.php.net", $ping);

// V systému Windows - exec("ping -n 5 www.php.net. $ping);

pro ($i=0; $i< count($ping);$i++) :

tisk "
$ping[$i]";

Výsledek:

PING www.php.net (208.247.106.187): 56 datových bajtů

64 bajtů z 208.247.106.187: icmp_seq=0 ttl=243 čas=66,602 ms

64 bajtů z 208.247.106.187: icmp_seq=1 ttl=243 čas=55,723 ms

64 bajtů z 208.247.106.187: icmp_seq=2 ttl=243 čas=70,779 ms

64 bajtů z 208.247.106.187: icmp_seq=3 ttl=243 čas=55,339 ms

64 bajtů z 208.247.106.187: icmp_seq=4 ttl=243 čas=69,865 ms

www.php.net statistiky ping --

5 přenesených paketů. 5 přijatých paketů. 0% ztráta paketů

zpáteční min/prům/max/stddev – 55,339/63,662/70,779/6,783 ms

Zpětné apostrofy

Existuje ještě jeden způsob, jak spouštět systémové příkazy, které nevyžadují volání funkcí - vykonávaný příkaz je uzavřen v zadních značkách (` `) a výsledky jeho operace se zobrazují v prohlížeči. Příklad:

tisk "

$výstup
";

Tento úryvek zobrazuje obsah adresáře, ve kterém je skript v prohlížeči umístěn.

Interní parametr ping -c 5 (-p 5 v systému Windows) určuje počet dotazů serveru.

Pokud chcete pouze vrátit neformátované výsledky příkazu, použijte funkci passthru() popsanou níže.

Funkce passthru() funguje v podstatě stejně jako exec(), s jedinou výjimkou – automaticky vypisuje výsledky příkazu. Syntaxe funkce passthru() je:

void passthru (příkaz řetězce [, int return])

Pokud je při volání passthru() předán volitelný návratový parametr, tato proměnná je nastavena na návratový kód provedeného příkazu.

escapeshellcmd()

Funkce escapeshellcmd() escapuje všechny potenciálně nebezpečné znaky, které může uživatel zadat (například do formuláře HTML) za účelem provedení příkazů exec(), passthru(), system() nebo popen(). Syntax:

string escapeshellcmd (příkaz string)

Uživatelské vstupy by měly být vždy zacházeny s určitou opatrností, ale i tak mohou uživatelé zadávat příkazy, které budou provedeny funkcemi systémových příkazů. Zvažte následující úryvek:

$user_input = `rm -rf *`; // Smaže nadřazený adresář a všechny jeho podadresáře

exec($user_input); // Spustit $user_input !!!

Pokud nebudou přijata žádná opatření, povede takový příkaz ke katastrofě. Můžete však použít funkce escapeshellcmd() k úniku uživatelského vstupu:

$user_input = `rm - rf *`; // Smaže nadřazený adresář a všechny jeho podadresáře

ex(escapeshellcmd($user_input)); // Uniknout nebezpečným postavám

Funkce escapeshellcmd() unikne znaku * a zabrání tomu, aby měl příkaz katastrofální následky.

Bezpečnost je jedním z nejdůležitějších aspektů webového programování, proto jsem tomuto tématu a jeho vztahu k programování v PHP věnoval celou kapitolu. Další informace naleznete v kapitole 16.

Práce se souborovým systémem

PHP má funkce pro prohlížení a provádění různých operací se soubory na serveru. Informace o atributech souborů serveru (umístění, vlastník a oprávnění) jsou často užitečné.

Funkce basename() extrahuje název souboru z předaného celého jména. Syntaxe funkce Basename():

řetězec základní název (celý_název řetězce)

Extrahování názvu základního souboru z celého názvu se provádí následovně:

$path = "/usr/local/phppower/htdocs/index.php"; $soubor = základní název($cesta); // $file = "index.php"

Tato funkce ve skutečnosti odstraní cestu z celého názvu a ponechá pouze název souboru.

Funkce getlastmod() vrací datum a čas poslední úpravy stránky, ze které je funkce volána. Syntaxe funkce Getlastmod():

int getlastmod(void)

Vrácená hodnota má formát data/času UNIX a k jejímu formátování můžete použít funkci date(). Následující úryvek zobrazuje datum poslední úpravy stránky:

echo "Poslední úprava: ".date("H:i:s a". getlastmod());

Funkce stat() vrací indexovatelné pole s podrobnými informacemi o souboru s daným názvem:

statistika pole (řetězec názvu souboru)

V prvcích pole jsou vráceny následující informace:

0 Zařízení

2 Režim ochrany indexového uzlu

3 Počet odkazů

4 ID uživatele vlastníka

5 ID skupiny vlastníků

6 Typ zařízení indexového uzlu

7 Velikost v bajtech

8 Čas posledního hovoru

9 Čas poslední úpravy

10 Čas poslední úpravy

11 Velikost bloku pro I/O souborového systému

12 Počet přidělených bloků

Pokud tedy chcete vědět, kdy byl soubor naposledy zpřístupněn, podívejte se na prvek 8 vráceného pole. Podívejme se na příklad:

$soubor - "datasoubor.txt";

seznam($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $velikost, $atime, $mtime, $ctime,

$bsize) = stat($soubor);

print "$soubor je $velikost bytů.
";

print "Čas posledního přístupu: $atime
";

print "Čas poslední úpravy: $mtime
";

Výsledek:

popen.php má 289 bajtů.

Čas posledního přístupu: 15. srpna 2000 12:00:00

Čas poslední úpravy: 15. srpna 2000 10:07:18

V tomto příkladu jsem použil konstrukci list() k přiřazení názvů každé návratové hodnotě. Samozřejmě můžete stejně snadno vrátit pole, procházet prvky a zobrazit všechny potřebné informace. Jak vidíte, funkce stat() vám umožňuje získat různé užitečné informace o souboru.

Zobrazení a změna vlastností souboru

Každý soubor v systémech rodiny UNIX má tři důležité vlastnosti:

  • příslušnost ke skupině;
  • majitel;
  • oprávnění.

Všechny tyto vlastnosti lze změnit pomocí příslušných funkcí PHP. Funkce popsané v této části nefungují v systémech řady Windows.

Pokud nemáte zkušenosti s operačními systémy UNIX, informace o vlastnostech souborového systému UNIX naleznete na adrese http://sunsite.auc.dk/linux-newbie/FAQ2.htm. Témata členství ve skupině, vlastnictví a oprávnění jsou popsána v části 3.2.6.

Funkce chgrp() se pokouší změnit skupinu, do které daný soubor patří. syntaxe funkce chgrp():

int chgrp (řetězcový název souboru, smíšená skupina)

Funkce filegroup() vrací ID skupiny vlastníka souboru s daným názvem nebo FALSE při chybě. Syntaxe funkce Filegroup():

int skupina souborů (řetězec názvu souboru)

Funkce chmod() změní oprávnění souboru s daným názvem. Syntaxe funkce chmod():

int chmod (řetězec názvu souboru, int oprávnění)

Oprávnění jsou specifikována v osmičkovém zápisu. Specifika nastavení parametru funkce chmod() jsou demonstrována v následujícím příkladu:

chmod("datovy_soubor.txt", g+r); // Nefunguje

chmod("datovy_soubor.txt", 766); // Nefunguje

chmod("datovy_soubor.txt", 0766); // Funguje

Funkce fileperms() vrací oprávnění souboru s daným názvem nebo FALSE při chybě. Syntaxe funkce Fileperms():

int fileperms (řetězec názvu souboru)

Funkce chown() se pokouší změnit vlastníka souboru. Právo změnit vlastníka souboru je omezeno na privilegovaného uživatele. Syntaxe funkce chown():

int chown (řetězcový název souboru, smíšený uživatel)

Funkce fileowner() vrací ID uživatele pro vlastníka souboru s daným jménem. Syntaxe funkce Fileowner():

int vlastník souboru (řetězcový název souboru)

Kopírování a přejmenování souborů

Mezi další užitečné systémové funkce, které lze provádět v PHP skriptech, patří kopírování a přejmenování souborů na serveru. Tyto operace provádějí dvě funkce: copy() a rename().

Kopírování souboru ve skriptu PHP není o nic obtížnější než použití příkazu UNIX cf. Problém řeší PHP funkce copy(). Syntaxe funkce soru() je:

int kopie (zdrojový řetězec, cílový řetězec)

Funkce copy() se pokouší zkopírovat zdrojový soubor do cílového souboru; Při úspěchu se vrací TRUE, při neúspěchu FALSE. Pokud cílový soubor neexistuje, funkce copy() jej vytvoří. Následující příklad ukazuje, jak vytvořit záložní kopii souboru pomocí funkce copy():

$data_file = "data.txt";

copy($data_file. $data_file".bak") or die("Nelze zkopírovat $data_file");

Funkce rename() přejmenuje soubor. Je-li úspěšná, je vrácena hodnota TRUE a pokud je neúspěšná, je vrácena hodnota FALSE. Syntaxe funkce Rename():

bool přejmenování (řetězec staré_jméno, řetězec nový_název)

Příklad přejmenování souboru pomocí funkce rename():

$data_file = "data.txt";

rename($datový soubor, $datový soubor".old") or die("Nelze přejmenovat $datový soubor");

Mazání souborů

Funkce unlink() odstraní soubor s daným názvem. Syntax:

int unlink (řetězcový soubor)

Pokud pracujete s PHP na systému Windows, můžete někdy zaznamenat problémy s používáním této funkce. V tomto případě můžete použít funkci system() popsanou výše a soubor smazat příkazem DOS del:

system("del nazev_souboru.txt");

Práce s katalogy

Funkce PHP umožňují prohlížet a procházet obsah adresářů. Výpis 7.8 ukazuje typickou strukturu adresářů v systému UNIX.

Výpis 7.8. Typická adresářová struktura

Funkce dirname() doplňuje basename() - extrahuje cestu z plně kvalifikovaného názvu souboru. Syntaxe funkce dirname() je:

řetězec dirname (cesta řetězce)

Příklad použití dirname() k extrahování cesty z celého jména:

$path = "/usr/locla/phppower/htdocs/index.php";

$soubor = dirname($cesta); // $file = "usr/local/phppower/htdocs"

Funkce dirname() se někdy používá ve spojení s proměnnou $SCRIPT_FILENAME k získání úplné cesty ke skriptu, ze kterého se příkaz provádí:

$dir - dirname($SCRIPT_FILENAME);

Funkce is_dir() kontroluje, zda soubor s daným jménem je adresář:

bool is_dir (řetězec názvu souboru)

Následující příklad používá adresářovou strukturu z výpisu 7.8:

$ isdir = is_dir("index.html"); // Vrátí FALSE

$isdir = is_dir("kniha"); // Vrátí TRUE

Funkce mkdir() dělá totéž jako příkaz UNIX se stejným názvem, vytváří nový adresář. Syntaxe funkce mkdir():

int mkdir (cesta řetězce, režim int)

Parametr path určuje cestu k vytvoření nového adresáře. Nezapomeňte ukončit parametr názvem nového adresáře! Parametr mode určuje oprávnění přiřazená k vytvořenému adresáři.

Stejně jako funkce fopen() otevírá manipulátor pro práci s daným souborem, funkce opendir() otevírá manipulátor pro práci s adresářem. Syntaxe funkce opendir() je:

int opendir (cesta řetězce)

Funkce closedir() zavře popisovač adresáře předaný jako parametr. Syntaxe funkce closedir() je:

void closedir (int directory_manipulator)

Funkce readdir() vrací další prvek zadaného adresáře. Syntax:

řetězec readdir (int directory_manipulator)

Pomocí této funkce můžete snadno vypsat všechny soubory a podadresáře umístěné v aktuálním adresáři:

$dh = opendir(" .);

while ($file = readdir($dh)) :

vytisknout "$file
"; na konci;

Funkce chdir() funguje stejně jako UNIXový příkaz cd, změní se do adresáře určeného parametrem. syntaxe funkce chdir():

int chdir (adresář řetězců)

V následujícím příkladu přejdeme do podadresáře kniha/ a vytiskneme jeho obsah:

$newdir = "kniha";

chdir($newdir) or die("Nelze změnit na adresář ($newdir)"); $dh = opendir(" .");

while ($soubor = readdir($dh)) ;

vytisknout "$file
";

Funkce rewlnddir() přesune ukazatel aktuální pozice na začátek adresáře otevřeného funkcí opendir(). Syntaxe funkce rewinddir() je:

void rewinddir (int directory_manipulator)

Projekt 1: Jednoduché počítadlo zásahů

Skript uvedený v této části počítá počet přístupů na stránku, na které se nachází. Než přejdete ke kódu ve výpisu 7.9, projděte si algoritmus napsaný v pseudokódu:

  1. Přiřaďte proměnné $access název souboru, ve kterém bude uložena hodnota čítače.
  2. Pomocí funkce file() načtěte obsah $access do pole $visits. Předpona @ před názvem funkce potlačuje možné chyby (například neexistuje žádný soubor s daným názvem).
  3. Nastavte proměnnou $current_visitors na hodnotu prvního (a jediného) prvku pole $visits.
  4. Zvyšte hodnotu $current_visitors o 1.
  5. Otevřete soubor $access pro zápis a nastavte ukazatel aktuální pozice na začátek souboru.
  6. Zapište hodnotu $current_visitors do souboru $access.
  7. Zavřete manipulátor, který odkazuje na soubor $access.

Výpis 7.9. Jednoduché počítadlo zásahů

// Skript: jednoduché počítadlo zásahů

// Účel: uložení počtu zásahů do souboru

$access = "hits.txt"; // Název souboru je zvolen libovolně

$aktuální_návštěvníci = $návštěvy; // Načte první (a jediný) prvek

+$aktuální_návštěvníci; // Zvyšte počítadlo zásahů

$fh = fopen($access. "w"); // Otevřete soubor hits.txt a nainstalujte

// ukazatel na aktuální pozici na začátku souboru

@fwrite($fh, $current_visitors);// Zapište novou hodnotu čítače

// do souboru "hits.txt"

fclose($fh); // Zavřete manipulátor souboru "hits.txt"

Projekt 2: vytvoření mapy lokality

Skript ve Výpisu 7.10 vytvoří mapu webu, hierarchické zobrazení všech složek a souborů na serveru, počínaje daným adresářem. Výpočet odsazení prvků, které tvoří mapu webu, využívá funkce definované v této a předchozích kapitolách. Než přejdete k programu, projděte si algoritmus napsaný v pseudokódu:

  1. Deklarujte servisní proměnné pro uložení nadřazeného adresáře, název grafického souboru s obrázkem složky, název stránky a příznak OS serveru (Windows nebo jiný systém).
  2. Deklarujte funkci display_directory(), která čte obsah adresáře a formátuje jej pro zobrazení v prohlížeči.
  3. Vytvořte cestu k adresáři kombinací názvu předaného v proměnné $dir1 s $dir.
  4. Otevřete adresář a přečtěte si jeho obsah. Formátujte názvy adresářů a souborů a zobrazte je v prohlížeči.
  5. Pokud je aktuální soubor adresář, zavolejte rekurzivně display_di rectory() a předejte mu název nového adresáře, který se má zobrazit. Vypočítejte odsazení použité při formátování výstupu.

Pokud soubor není adresář, je naformátován tak, aby se zobrazil jako hypertextový odkaz (a vypočítá se také odsazení použité při formátování).

Výpis 7.10. Program Sitemap.php

// Soubor: sitemap.php

// Účel: vytvoření mapy webu

// Adresář, ze kterého začíná sestavení mapy

$beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// Soubor s grafickým obrázkem složky.

// Cesta musí být relativní* ke kořenovému adresáři serveru Apache

$folder_location = "C:\My Documents\PHP for Programmers\FINAL CHPS\graphics\folder.gif";

// Text v titulku okna $page_name = "PHPRecipes SiteMap";

// Na jakém systému bude skript použit - Linux nebo Windows?

// (0 – Windows; 1 – Linux)

$usingjinux = 0;

// Funkce: display_directory

// Účel: čtení obsahu adresáře určeného parametrem

// $dir1, následuje formátování adresáře a hierarchie souborů.

// Funkci lze volat rekurzivně.

function display_directory ($dir1, $folder_location, $using_linux, $init_depth) (

// Aktualizace cesty

Sdh = opendir($dir);

while($file = readdir($dh)) :

// Prvky adresáře "." a ".." se nezobrazí.

if (($file != ".") && ($file != "..")) :

if ($using_linux == 0) :

$depth = explode("\\", $dir): else:

$hloubka = explode("/", $dir); endif; $aktuální_hloubka = sizeof($hloubka);

// Vytvořte cestu podle pravidel použitého operačního systému. if ($using_linux == 0) :

$tab_depth = $current_deptn - $init_depth;

$soubor = $dir. "\\", $soubor; jiný:

$soubor = $dir. "/", $soubor; endif;

// Obsahuje $file adresář? if (je dir($soubor)) :

// Výpočet odsazení

zatímco ($x< ($tab_depth * 2)) :

$x++; na konci;

tisk "

".basename($file)."
";

// Počítadlo přírůstků

// Rekurzivní volání display_directory()

display_directory($soubor, $umístění_složky, $using_linux, $init_depth);

// Není to adresář

// Vytvořte cestu podle použitých pravidel

// operační systém.

if ($using_linux == 0) :

$tab_depth = ($current_depth - $init_depth) - 2; $x = 0;

// Výpočet odsazení

zatímco ($x< (($tab_depth * 2) + 5)) :

tisk " ".basename($file)."
";

tisk " ".basename($file)."
";

endif; // Is_dir(file) endif: // If ! "." nebo ".."

// Zavře adresář closedir($dh);

<? print "$page_name"; ?>

// Výpočet počátečního odsazení

if ($using_linux == 0) :

$hloubka = explode("\\", $beg_path);

$depth = explode("/", $beg_path);

$init_depth = sizeof($depth);

display_directory($beg_path, $folder_location, $using_linux, $init_depth);

Na Obr. Obrázek 7.1 ukazuje výsledek spuštění skriptu proti adresáři obsahujícímu několik kapitol této knihy.

Rýže. 7.1. Zobrazení adresářové struktury na serveru pomocí skriptu sitemap.php

Výsledek

Tato kapitola představila mnoho nástrojů PHP pro práci se soubory. Zejména jsme se zabývali následujícími problémy:

  • kontrola existence souborů;
  • otevírání a zavírání souborů a I/O proudů;
  • zápis do souboru a čtení ze souboru;
  • přesměrování souboru do výstupního proudu;
  • spouštění externích programů;
  • operace souborového systému.

Materiál v této kapitole připravuje půdu pro další kapitolu „Řetězce a regulární výrazy“, protože při vývoji webových aplikací spolu zpracování řetězců a I/O operace velmi úzce souvisí.

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

file_get_contents — Přečte obsah souboru do řetězce

Popis

Tětiva file_get_contents (řetězec $filename [, bool $use_include_path = false [, zdroj $kontext [, int $offset = -1 [, int $maxlen ]]]])

Tato funkce je podobná funkci soubor() s jediným rozdílem, že file_get_contents() vrátí obsah souboru v řetězci, počínaje zadaným offsetem a až do maxlen bajtů. V případě neúspěchu, file_get_contents() vrátí se NEPRAVDIVÉ.

Pomocí funkce file_get_contents() Nejvýhodnější je, pokud potřebujete získat celý obsah souboru, protože tato funkce používá ke zlepšení výkonu techniku ​​mapování souborů do paměti, pokud je podporována vaším operačním systémem.

Komentář:

Pokud otevíráte URI obsahující speciální znaky, jako je mezera, musíte URI zakódovat pomocí urlencode().

Seznam parametrů

Název čteného souboru.

Use_include_path

Komentář:

Od PHP 5 můžete použít konstantu FILE_USE_INCLUDE_PATH pro vyhledání souboru v začleněné cestě.

kontext

Platný kontextový prostředek vytvořený pomocí funkce stream_context_create(). Pokud není potřeba použít speciální kontext, můžete tento parametr přeskočit předáním hodnoty NULA.

Posun, ve kterém začne čtení původního datového proudu.

Hledání posunu není podporováno při práci se vzdálenými soubory. Pokus o nalezení offsetu u nelokálních souborů může fungovat pro malé offsety, ale výsledek je nepředvídatelný, protože běží na streamu s vyrovnávací pamětí.

Maximální velikost čtených dat. Ve výchozím nastavení se čtení provádí, dokud není dosaženo konce souboru. Toto nastavení platí také pro streamy s filtry.

Návratové hodnoty

Funkce vrací načtená data resp NEPRAVDIVÉ v případě chyby.

Pozornost

Tato funkce se může vrátit jako booleovská NEPRAVDIVÉ a nebooleovská hodnota, která je přetypována NEPRAVDIVÉ. Další informace naleznete v části Booleovský typ. Pomocí operátoru === zkontrolujte hodnotu vrácenou touto funkcí.

Chyby

Bude generována chyba úrovně E_VAROVÁNÍ pokud nelze najít parametr název_souboru, je parametr maxlength menší než nula nebo selže hledání s offsetem v proudu.

Příklady

Příklad č. 1 Získejte a zobrazte zdrojový kód domovské stránky webu

$homepage = file_get_contents("http://www.example.com/");
echo $domovská stránka ;
?>

Příklad č. 2 Hledání souborů v include_path

// <= PHP 5
$file = file_get_contents(./people.txt" , true );
// > PHP 5
$file = file_get_contents(./people.txt" , FILE_USE_INCLUDE_PATH);
?>

Příklad č. 3 Čtení části souboru

// Přečte 14 znaků, počínaje znakem 21
$section = file_get_contents(./people.txt" , NULL , NULL , 20 , 14 );
var_dump($sekce);
?>

Výsledek spuštění tohoto příkladu bude něco takového:

řetězec(14) "lle Bjori Ro"

Příklad č. 4 Použití kontextů streamování

// Vytvořte vlákno
$opts = pole(
"http" =>pole(
"metoda" => "GET" ,
"header" => "Přijmout-jazyk: cs\r\n" .
"Cookie: foo=bar\r\n"
);

$context = stream_context_create ($opts);

// Otevřete soubor pomocí výše uvedených záhlaví HTTP
$file = file_get_contents ("http://www.example.com/" , false , $kontext );
?>

Close_notify. PHP to ohlásí jako „SSL: Fatal Protocol Error“ ve chvíli, kdy se dostanete na konec dat. Chcete-li to obejít, měli byste nastavit error_reporting na úroveň, která vylučuje E_WARNING. PHP verze 4.3.7 a starší dokážou při otevírání streamu pomocí wrapperu zjistit, že na straně serveru je problematická IIS https:// a nezobrazuje varování. Pokud používáte fsockopen() pro tvoření ssl:// zásuvce, je vaší odpovědností toto varování detekovat a potlačit.

V PHP se často musíte vypořádat s vytvořením souboru... je to velmi jednoduché: na disku není žádný soubor, kód byl spuštěn a soubor se objevil, pak můžete tento soubor načíst do jiné proměnné nebo dokonce na jakoukoli stránku na Internet a pak tam něco napsat... ale k tomu je potřeba znát speciální funkce... více o tom v tomto článku...

Chcete-li vytvořit soubor v PHP ve spustitelném skriptu, stačí zadat několik funkcí:

Podívejme se na příklad:

$text = "Nějaký text k zápisu do souboru";
$fp = fopen("soubor.txt", "w");
fwrite($fp, $text);
fclose($fp);
?>

Tady byste to měli vědět:

fopen()- funkce otevře soubor pro čtení nebo zápis a vysvětlení;

Toto upřesnění (parametr režimu funkce fopen) je velmi důležité:

  • "r" - otevřete soubor v php Pouze na čtení. Kurzor se umístí na začátek.
  • "r+" - otevřete soubor v php pro čtení a psaní. Kurzor se umístí na začátek. !!! - v těchto dvou režimech r a r+ musí být soubory již vytvořeny (jinak se objeví chyba Varování: fopen(soubor.txt): Nepodařilo se otevřít stream: Žádný takový soubor nebo adresář v ...), a pouze čteme nebo máme možnost doplnit.
  • "w" - soubor se otevře POUZE pro zápis. Soubor se zkrátí na nulovou délku - tedy přepíše. Zapíše se co je potřeba a kurzor se umístí na začátek.
  • "w+" - otevře soubor pro zápis A ČTENÍ! Zbytek je stejný jako v režimu "w". !!! - v těchto dvou režimech - pokud soubor nebyl vytvořen - BUDE PROVEDEN POKUS O JEHO VYTVOŘENÍ!
  • "A" - otevřít soubor POUZE pro zápis. Na rozdíl od "w" tato volba nepřepíše obsah souboru, ale umístí kurzor na konec řádku a připojí obsah, který jsme chtěli přidat na konec.
  • "a+" - otevřete soubor pro zápis a čtení.

fwrite($fp, $text) - funkce pro zápis do souboru v PHP - tedy to, co je v proměnné $text, se zapisuje do souboru, který je v proměnné $fp;

fzavřít($fp) - funkce pro uzavření souboru, který jsme zapsali do proměnné $fp;

Nyní můžete snadno správně vytvářet soubory v php, otevírat je pro čtení a úpravy.

Užitečné doplňky a funkce PHP pro práci s otevřeným souborem:

while(!feof($fp))(
$mytext = fgets($fp, 99);
echo $mytext."
";
}

zde je splněna podmínka - "dokud nebude dosaženo konce souboru, proveďte toto" while(!feof($fp))

1. Funkce fgets($fp, 99) – umožňuje rozdělit veškerý obsah do sekcí o velikosti 99 bajtů a dále, abychom to viděli jasněji, umísťujeme značku

Tato funkce řetězce fgets(resource handle [, délka int]) standardně přijímá 1024 bajtů (1 kilobajt) jako parametr délky, pokud není zadán, bude tomu tak. Tento parametr je od PHP 4.2.0 volitelný (v případě chyby vrací FALSE)

Další funkce pro otevírání, zápis a vytváření souboru

Funkce - int readfile(řetězec název_souboru [, bool use_include_path [, kontext zdroje]]) - číst soubor jako celek.

Přečte soubor a zapíše obsah do výstupní vyrovnávací paměti. A vrátí počet bajtů výstupu. V případě chyby se vrátí, pokud se pes nepoužívá - @readfile.

Stane se něco takového:

Na konci slova je značka
.

b. Funkce - pole soubor(řetězec název_souboru [, int use_include_path [, zdrojový kontext]]), dělá totéž jako funkce readfile, s jedinou výjimkou přidá obsah souboru do pole:

Tímto způsobem můžete číst libovolné stránky na internetu: $lines = file("http://site/"); a iterujte polem pomocí funkce foreach;

3a. funkce řetězce file_get_contents(řetězec název_souboru [, bool use_include_path [, zdroj kontext [, int offset [, int maxlen]]]] – umožňuje získat obsah jako jeden řetězec.

Toto je univerzálnější funkce PHP pro čtení souboru, podobná funkci file, pouze obsah je vrácen jako řetězec, nikoli pole a lze nastavit podmínky - kterým byte začít - offset a kde skončit - maxlen. Při selhání vrátí hodnotu FALSE.

Důležité!!!- v tomto případě funkce nahradí 3 najednou: fopen(), fread() a fclose() a tím se zbaví značky.

3b. funkce int file_put_contents(řetězec název_souboru, smíšená data [, příznaky int [, kontext zdroje]]) - totožné se sekvenčním voláním funkcí fopen(), fwrite() a fclose() - vrací počet zapsaných bajtů.

Poslední aktualizace: 1.11.2015

Jako většina programovacích jazyků i PHP podporuje práci se soubory, které jsou jedním ze způsobů ukládání informací.

Čtení a zápis souborů

Otevírání a zavírání souborů

Pro otevírání souborů v PHP je definována funkce fopen(). Má následující definici: resource fopen(řetězec $název_souboru, řetězec $režim) . První parametr $filename představuje cestu k souboru a druhý je režim otevírání. V závislosti na účelu otevření a typu souboru může tento parametr nabývat následujících hodnot:

    "r" : Soubor je otevřen pouze pro čtení. Pokud soubor neexistuje, vrátí hodnotu false

    "r+" : Soubor je otevřen pouze pro čtení a lze do něj zapisovat. Pokud soubor neexistuje, vrátí hodnotu false

    "w" : Soubor je otevřen pro zápis. Pokud takový soubor již existuje, pak je přepsán, pokud ne, pak je vytvořen

    "w+" : Soubor je otevřen pro zápis a je čitelný. Pokud takový soubor již existuje, pak je přepsán, pokud ne, pak je vytvořen

    "a" : Soubor je otevřen pro zápis. Pokud takový soubor již existuje, pak se data zapíší na konec souboru a stará data zůstanou. Pokud soubor neexistuje, je vytvořen

    "a+" : Soubor je otevřen pro čtení a zápis. Pokud soubor již existuje, pak se data připojí na konec souboru. Pokud soubor neexistuje, je vytvořen

Výstupem funkce fopen bude deskriptor souboru. Tento popisovač se používá pro operace se soubory a pro zavření souboru.

Po dokončení práce je třeba soubor zavřít pomocí funkce fclose(), která jako parametr přebírá deskriptor souboru. Například otevřeme a zavřeme soubor:

$fd = fopen("form.php", "r") or die("soubor nelze otevřít"); fclose($fd);

Konstrukce or die("text chyby") umožňuje skriptu zastavit běh a zobrazit nějaké chybové hlášení, pokud funkce fopen nemohla soubor otevřít.

Čtení souboru

Ke čtení souboru můžete použít několik funkcí. Pro čtení po řádcích se používá funkce fgets(), která přijímá deskriptor souboru a vrací jeden přečtený řádek. Pojďme si projít celý soubor řádek po řádku:

Pokaždé, když je zavoláno fgets(), PHP umístí ukazatel na konec čteného řádku. Ke sledování konce souboru se používá funkce feof(), která po skončení souboru vrátí hodnotu true. A dokud není dosaženo konce souboru, můžeme použít funkci fgets().

Čtení celého souboru

V tomto případě nemusíme explicitně otevřít soubor, získat popisovač a pak soubor zavřít.

Blokové čtení

Můžete také provádět čtení blok po bloku, to znamená číst určitý počet bajtů ze souboru pomocí funkce fread():

Funkce fread() má dva parametry: popisovač souboru ke čtení a počet bajtů ke čtení. Při čtení bloku se ukazatel v souboru přesune na konec tohoto bloku. A také pomocí funkce feof() můžete sledovat dokončení souboru.

Napište soubor

Chcete-li zapsat soubor, použijte funkci fwrite(), která do souboru zapíše následující řádek:

Další funkce fputs() funguje podobně:

Práce s ukazatelem souboru

Při otevírání souboru pro čtení nebo zápis v režimu "w" je ukazatel v souboru umístěn na začátek. Při čtení dat PHP přesune ukazatel v souboru na konec bloku načtených dat. Můžeme však také ručně manipulovat s ukazatelem v souboru a nastavit jej na libovolné místo. Chcete-li to provést, musíte použít funkci fhledat, který má následující formální definici:

Int fseek (zdroj $handle , int $offset [, int $whence = SEEK_SET ])

Parametr $handle představuje popisovač souboru. Parametr $offset je posun v bajtech vzhledem k začátku souboru, od kterého začne čtení/zápis. Třetí volitelný parametr určuje, jak se nastavuje posun. Může nabývat tří hodnot:

    SEEK_SET : výchozí hodnota, nastavuje offset v offsetových bajtech vzhledem k začátku souboru

    SEEK_CUR : nastavuje offset v offsetových bajtech vzhledem k začátku aktuální pozice v souboru

    SEEK_END : nastaví posun na posunutí bajtů od konce souboru

Pokud je ukazatel úspěšně nainstalován, funkce fseek() vrátí 0, a pokud je ukazatel neúspěšný, vrátí hodnotu -1.

Příklad použití funkce:

$fd = fopen("ahoj.txt", "w+") or die("soubor nelze otevřít"); $str = "Ahoj světe!"; // řádek pro zápis fwrite($fd, $str); // zapíše řádek na začátek fseek($fd, 0); // umístěte ukazatel na soubor na začátek fwrite($fd, "Oink"); // napište řádek na začátek fseek($fd, 0, SEEK_END); // umístěte ukazatel na konec fwrite($fd, $str); // napište další řádek na konec fclose($fd);