Kreirajte, otvarajte, čitajte, pišite, brišite i provjerite postojanje datoteke u PHP-u. Php kreiranje datoteke, čitanje i pisanje Php reda za čitanje iz datoteke

16.5K

U stvari, ono što otvoriti php fajl nije veliki problem. Može biti teže otvoriti flašu piva kada ste usred šume. Ali samo strastveni programeri misle na ovaj način. A za početnike, reći ćemo vam o svim mogućnostima PHP-a za rad s datotekama:

php datoteke

Datoteke sa ekstenzijom php sadrže kod napisan u istoimenom programskom jeziku. Za razliku od drugih jezika, php je programski jezik na strani servera. Odnosno, radi na strani servera. Stoga, da bi se otklonio njegov kod, lokalni server mora biti instaliran na klijentskoj mašini.

Za rad sa php datotekama koristite posebne aplikacije– uređivači softvera. Najčešći su:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP razvoj.
Prilikom kreiranja web lokacija zasnovanih na PHP-u, može biti potrebno višestruko korištenje programski kod. U takvim situacijama zgodno je povezati gotova rješenja koja se nalaze u drugoj datoteci. Za to se koristi konstrukcija uključivanja. Njegova sintaksa je:

uključiti naziv datoteke

Primjer povezivanja:

Uključeni fajl:


Uključivanje datoteke je također moguće pomoću konstrukcije require. Za razliku od uključivanja, uključuje datoteku prije nego što se programski kod izvrši. Koristeći require u kodu, moguć je samo jedan poziv ove datoteke. Kada ponovo kontaktirate, sistem će prikazati poruku o globalna greška i zaustavlja izvršavanje programa.

Konstrukcija uključivanja uključuje samo izvor tokom izvršavanja programa. Podržava višestruko čitanje php datoteke. Ako dođe do greške, prikazat će se samo poruka upozorenja, a izvršavanje koda će se nastaviti od sljedećeg reda.

Otvaranje i zatvaranje fajlova

U php-u se sve operacije s datotekama izvode u nekoliko faza:

  • Otvaranje datoteke;
  • Uređivanje sadržaja;
  • Zatvaranje fajla.

Funkcija fopen() se koristi za otvaranje datoteke. Njegova sintaksa je:

int fopen(string ime datoteke, string mode [, int use_include_path])

Prihvaćeni argumenti:

  • string filename – naziv datoteke ili apsolutna putanja do nje. Ako putanja do datoteke nije navedena, ona će se pretraživati ​​u trenutnom direktoriju. Ako datoteka koju tražite nedostaje, sistem će prikazati poruku o grešci. primjer:

  • string mode – označava način otvaranja datoteke. Vrijednosti prihvaćene argumentom:
  • r – datoteka je otvorena samo za čitanje, pokazivač datoteke je postavljen na početku;
  • r+ – datoteka je otvorena za čitanje i pisanje;
  • w – kreirano novi fajl samo za potrebe snimanja. Ako datoteka s istim imenom već postoji, postojat će automatsko uklanjanje svi podaci;
  • w+ - kreira novu datoteku za pisanje i čitanje. Kada takav fajl postoji, njegovi podaci se potpuno prepisuju novim;
  • a – datoteka je otvorena za pisanje. Pokazivač je postavljen na kraju. To jest, pisanje u php datoteku će početi ne od početka, već od kraja;
  • a+ – otvaranje datoteke u načinu čitanja i pisanja. Snimanje će početi od kraja;
  • b – način rada sa datotekom koja sadrži binarne podatke (in binarni sistem račun). Ovaj način rada je dostupan samo u operativni sistem Windows.

Da biste zatvorili pristup datoteci, koristite funkciju fclose(). sintaksa:

int fclose (int file) , gdje je int datoteka rukohvat stranice koju treba zatvoriti.

Nakon svakog čitanja ili pisanja, datoteka se mora zatvoriti ovom funkcijom. U suprotnom, tok kreiran za datoteku ostaje otvoren. A to dovodi do nepotrebne potrošnje kapaciteta servera.

primjer:

Čitanje i pisanje datoteka

Za jednostavno prikaz cjelokupnog sadržaja datoteke, funkcija readfile() je idealna. Njegova sintaksa je:

readfile (string filename) , gdje je string filename naziv datoteke stringa (a ne ručka).


Ista datoteka se može pročitati korištenjem funkcije fpassthru(). Čita podatke od pozicije krajnjeg pokazivača do kraja datoteke. Njegova sintaksa je:

int fpassthru (int datoteka)

Funkcija zahtijeva otvaranje i zatvaranje datoteke. primjer:

Rezultat je sličan prethodnom.

Funkcije za rad sa datotekama u php-u omogućavaju vam čitanje sadržaja red po red i znak po znak:

  • string fgets (int datoteka, int dužina)– funkcija čita niz dužine dužine . primjer:

  • string fread (int file, int dužina)– radnja je identična prethodnoj.

Za pisanje tekstualnih podataka u datoteku postoje dvije identične funkcije:

  • int fputs (int file, string string [, int length ])
  • int fwrite(int datoteka, string string [, int dužina])

Funkcije zapisuju u datoteku int niz string određene dužine int dužine ( neobavezni argument). primjer:

Kreiranje i brisanje fajlova

Da biste kreirali php fajl, možete koristiti funkciju fopen() u režimu pristupa "w" ili "w+". Or funkcija dodira(). Postavlja vrijeme izmjene datoteke. Ako ne postoji element sa traženim imenom, biće kreiran. Njegova sintaksa.

string fgets(ručnik resursa [, int dužina])

Vraća string dužine - 1 bajt pročitan iz deskriptora datoteke na koji ukazuje handle . Čitanje se završava kada broj pročitanih bajtova dostigne dužinu - 1, kada dostigne kraj reda (što je uključeno u povratnu vrijednost) ili kada dođe do kraja datoteke (što se prije dogodi). Ako dužina nije navedena, podrazumevano je 1 kilobajt ili 1024 bajta.

Ako dođe do greške, funkcija se vraća FALSE .

Najčešće greške:

Programeri navikli na semantiku "C" funkcija fgets(), mora uzeti u obzir razliku u načinu na koji se vraća oznaka kraja datoteke (EOF).

Pokazivač datoteke mora biti važeći i pokazivati ​​na datoteku koju su funkcije uspješno otvorile fopen() ili fsockopen() .

Ispod je jednostavan primjer:


Primjer 1. Čitanje datoteke red po red

$handle = fopen("/tmp/inputfile.txt" , "r");
dok (! feof ($handle)) (
$buffer = fgets($handle, 4096);
echo $buffer ;
}
fclose($handle);
?>

komentar: Parametar dužine postao je opcioni počevši od PHP verzije 4.2.0. Ako je ovaj parametar izostavljen, pretpostavlja se da je dužina stringa 1024. Od PHP 4.3, izostavljanje parametra dužine će uzrokovati čitanje toka do kraja stringa. Ako je većina redova u datoteci duža od 8 kilobajta, najefikasnije rješenje za resurse koje koristi skripta je specificiranje maksimalna dužina linije.

komentar: Ova funkcija može ispravno obraditi binarne podatke počevši od PHP 4.3. Ranije verzije nisu imale ovu funkciju.

PHP se pojavio mnogo kasnije nego što su programski jezici ojačali svoje pozicije i formulisali opšte ideje o sintaksi, logici, varijablama i drugim programskim objektima. Datoteke i funkcije za rad s njima nisu napredovale, pa čak ni problem kodiranja datoteka, koji je nastao iz prirodnih razloga, nije doveo do radikalno novih rješenja.

Opće napomene

Glavni rad sa fajlovima, kakvi god da su, sastoji se od otvaranja, čitanja/pisanja i zatvaranja. Možete koristiti funkcije blokiranja/deblokiranja pristupa datoteci dok se obrađuje, možete podesiti poziciju čitanja/pisanja u datoteci - sve je isto kao prije, u dalekoj prošlosti.

Važna tačka u PHP-u je obilje funkcija za rad sa datotekama i opcija za njihovo korišćenje. U praksi je dovoljno koristiti jednostavne, ali funkcionalne opcije. Datoteka je, prije svega, programska memorija. U njega možete pohraniti informacije. Svrha svakog programa, svrha svake web stranice je predstavljanje, obrada i osiguranje sigurnosti informacija.

Bitna okolnost

Ranije je zahtjev za kompatibilnošću, barem odozdo prema gore, bio nepokolebljiv. Odnosno, program jednom napisan u jednoj verziji programskog jezika idealno se kompajlira/tumači u sljedećoj verziji. IN moderno programiranje ovo je pogrešno. Zahtjev za kompatibilnošću sintaktičkih struktura jezika postao je stvar povijesti, a borba između stilova i programskih alata i verzija određenih alata postala je norma njihovog života.

Rad sa datotekama, kao i sa bazama podataka, jednako je važan kao i interfejs sajta. Prvi bi trebao biti izgrađen na način da prilikom promjene platforme, hostinga ili jezičke verzije nema potrebe za promjenom koda stranice. Interfejs za rad sa datotekama mora biti uključen u zasebnu skriptu i osigurati punu kompatibilnost, kao što se dizajn stranice mora adekvatno prilagoditi bilo kojem uređaju, pretraživaču i pružiti ostatku funkcionalnosti stranice sa istim mogućnostima.

Čitajte i mijenjajte sebe

Može li se program promijeniti sam, odnosno može li se skripta poboljšati? Ovo pitanje do danas zanima mnoge. Ali zadatak zvuči mnogo praktičnije: čitanje PHP-a PHP fajl. Programer ne može uvijek riješiti određeni problem pisanjem specifičnog koda. Ponekad ga je potrebno promijeniti kada posjetitelj dođe na stranicu i formuliše pitanje koje nije bilo predviđeno u fazi razvoja.

Kao iu svim drugim slučajevima, prije svega morate otvoriti datoteku. Nije bitno da li ovaj fajl postoji ili ne. Ako se zna da datoteka postoji (funkcija file_exists() daje pozitivan odgovor), funkcija fopen() se koristi sa pristupom 'r', 'r+', 'a', 'a+'. Ako datoteka još ne postoji, onda s pristupom 'a', 'a+', 'w', 'w+'. Rezultat otvaranja datoteke bit će njen deskriptor. Datoteka se zatvara funkcijom fclose().

Pogodno je koristiti PHP za čitanje datoteke u nizu kada nema potrebe da se obrađuje u trenutku čitanja.

if (file_exists($fName)) (

$aLines = fajl ($fName)

U ovoj opciji, svaki red datoteke ulazi u element niza sekvencijalno. Treba napomenuti da funkcije file() ili file_get_contents() ne moraju otvarati datoteku i zatvarati je.

Kada je ulazna datoteka prevelika i trebate pronaći samo malo informacija, ili iz drugih razloga, možete koristiti PHP za čitanje datoteke red po red. PHP pruža mogućnost da se to uradi pomoću funkcija fgets() i fgetc().

$fvs = fopen($fName, "r")

dok ((false !== ($cLine = fgets($fvs, 2000)) (

$cLines .="
" . $i . "). " . $cLine

Obje opcije rade besprijekorno. Međutim, kada obavljate PHP čitanje PHP datoteke za kasniju modifikaciju, treba preduzeti mere opreza. Nije uvijek moguće predvidjeti kako će ga posjetitelj koristiti u fazi razvoja stranice. Bolje je ako se skripte mijenjaju u okviru funkcija stranice, a kontrola ove promjene nije dostupna posjetitelju, uključujući administratora resursa.

Čuvanje rezultata

Primljene i ažurirane informacije se upisuju u datoteku pomoću funkcije fputs() red po red ili putem funkcije file_put_contents() u cjelini.

$fName = $_SERVER["DOCUMENT_ROOT"] . "/tmp/scData.php"

$fvs = fopen($fName, "a")

jato ($fvs, LOCK_EX)

$cLine = "1 red". chr(10)

fputs($fvs, $cLine)

$cLine = "2 reda" . chr(10)

fputs($fvs, $cLine)

jato ($fvs, LOCK_UN)

U opciji snimanja red po red, možete manipulirati podacima tokom procesa snimanja, u drugom slučaju, napisani niz ili niz se stavljaju u cijelu datoteku.

$file = " scData.php "

$cContents = file_get_contents($file)

// dodavanje unosa

$cContents .= "novi unos\n"

// zapisati datoteku nazad

file_put_contents($file, $cContents)

Čitanje i pisanje PHP datoteka je jednostavno i prirodno. Međutim, važno je imati na umu: svaka datoteka ima ime, ekstenziju i putanju (mapu). Da bi PHP skripta mogla čitati i pisati datoteke, skripta mora imati odgovarajuća prava. Oni su automatski izloženi na hostingu, ali u nekim slučajevima ih je potrebno proširiti.

U nekim slučajevima može biti poželjno provjeriti rezultate probnim očitavanjem. Pisanje PHP fajlova zahteva ovo tokom razvoja, ali u nekim slučajevima, u interesu bezbednosti ili pouzdanosti sajta, provera snimanja podataka je neophodna.

Karakteristična karakteristika PHP-a, MySQl-a, JavaScript-a, a posebno pretraživača: tiho dozvoljavanje nekih grešaka. “Nije prepoznato, nije urađeno...” - nije baš dobra praksa na prvoj liniji informacione tehnologije, ali to uči programere da ne griješe i pišu čist, kvalitetan kod, što također nije loše.

PHP i rad sa stvarnim dokumentima

PHP čitanje PHP fajla je svakako od praktičnog interesa, ali ovo je oblast programiranja. Korisnik i posetilac sajta su zainteresovani za informacije primenjene prirode, koje je navikao da vidi u obliku tabela i dokumenata, posebno u *.xlsx i * formatima. docx datoteke. To su datoteke u MS Excel i MS Word formatu.

Liste robe, cene, karakteristike se najčešće formiraju u obliku tabela, dakle PHP čitanje Excel fajl je od značajnog značaja.

PHPExcel i PHPWord biblioteke su razvijene za rad sa takvim datotekama. Međutim, sadržaj *.xlsx i *.docx datoteka je predstavljen u OOXML standardu, odnosno pravi, razumljivi dokument je predstavljen u zip arhivi. Zip arhiva je skup datoteka, uključujući slike, objekte, formule i umetke iz drugih programa. Tekstualne datoteke ovdje su predstavljene opisima u obliku oznaka. Čitanje takvog fajla nije dovoljno da ga raščlanite da biste dobili sadržaj i strukturu za upotrebu i modifikaciju.

To znači da se operacija čitanja pretvara u proceduru otvaranja arhive. Ove biblioteke samostalno otvaraju arhivu dokumenata i pružaju programeru opsežne funkcije za čitanje, obradu i pisanje takvih dokumenata.

Excel tabele

include_once 'PhpOffice/PhpExcel/IOFactory.php'

funkcija scGetExcelFile($xls)(

$objPHPExcel = PHPExcel_IOFactory::load($xls)

$objPHPExcel->setActiveSheetIndex(0)

//ovaj niz sadrži nizove stringova

$aSheet = $objPHPExcel->getActiveSheet()

$array = niz()

//treatment

foreach($aSheet->getRowIterator() kao $row)(

$cellIterator = $row->getCellIterator()

foreach($cellIterator kao $cell)(

array_push($item, iconv("utf-8", "cp1251", $cell->getCalculatedValue()))

array_push($array, $item)

Čitanje i obrada Excel datoteka je mnogo teže obraditi Word dokumenti. Najbolja opcija Ako treba da implementirate ozbiljan projekat čitanja i obrade primenjenih informacija, prvo savladajte PHPWord biblioteku. To će vam pružiti dobro iskustvo i brzo razumijevanje specifičnosti problema.

Word dokumenti

Samo dva reda:

$oWord = novo \PhpOffice\PhpWord\PhpWord()

$oDocx = $this->oWord->loadTemplate($cFileName)

Dokument $cFileName je sada dostupan za obradu. Zatim se otvara arhiva, odabire i analizira njen sadržaj, koji se može prikazati na web stranici, mijenjati i vraćati nazad.

$zipClass = novi ZipArchive()

$zipClass->open($this->tempFileName)

// pročitajte cijeli sadržaj dokumenta

za ($i=0; $i<$zipClass->numFiles; $i++) (

$cNameIn = $zipClass->getNameIndex($i)

$cNameInExt = substr($cNameIn, -4)

if (($cNameInExt == ".xml") || ($cNameInExt == "rels")) (

// datoteke s ekstenzijama ".xml" i ".xml.rels" se spremaju u tablicu dokumenata

// svaki xml red je napisan jedinstvenim brojem po redu

$cBodyIn = $zipClass->getFromName($cNameIn)

$cBodyInLen = strlen($cBodyIn)

// svi ostali fajlovi se upisuju u fasciklu dokumenta onakvi kakvi jesu

$cNameOnly = substr($cNameIn, strrpos($cNameIn, "/") + 1)

$zipClass->getFromName($cNameIn, $cWorkPath); // sadržaj kao fajl

Mogućnosti koje se otvaraju kada PHP pomoć Excel i PHP Word vam omogućavaju da manipulišete stvarnim dokumentima i učinite njihov sadržaj relevantnim u bilo kom trenutku. U današnjem dinamičnom svijetu, ovo postaje veoma važno. Težište se odavno pomerilo sa lokalne upotrebe kompjuterske tehnologije na virtuelni internet prostor. Stoga je kreiranje tabela i dokumenata u lokalnim Microsoft proizvodima manje efikasno od rada s takvim dokumentima u automatskom i poluautomatskom načinu rada na web stranici, koja je dostupna ne samo kreatoru tabele ili dokumenta, već i njegovim korisnicima.

Tekstualni fajlovi, drugi život

U prvoj aproksimaciji, tekstualne datoteke su jednostavnije od PHP datoteka ili aplikacijskih dokumenata. Međutim, ovdje se ima o čemu razmišljati. Operacije čitanja/pisanja takvih datoteka su već navedene gore, ali značenje takvih datoteka je mnogo važnije.

Pošto postoji takva datost kao što su klijent i server (prvim dominira JavaScript, a drugim PHP), onda čak ni mehanizmi kolačića i sesija ne mogu da se izbore sa potrebom za prenosom informacija između skripti, stranica ili određenih procesa.

Moguće je odraziti željene promjene u bazi podataka, ali uz sve svoje prednosti i brzinu, mali privremeni ili trajni tekstualni fajlovi mogu biti mnogo zanimljivija opcija za prijenos informacija. Ako ne kreirate puno malih datoteka i ne kontrolirate njihovu veličinu, oni mogu biti specifična i fleksibilnija verzija baze podataka.

PHP čita tekstualnu datoteku je brzo, može se odmah raščlaniti u strukturu, niz ili objekat. Ovo posljednje je vrlo važno, jer vam omogućava da kreirate objekte koji žive izvan predviđenog vremena PHP skripta, koji, kao što znate, može postojati samo na serveru i samo u vrijeme učitavanja stranice, generira se AJAX odgovor ili iz nekog drugog razloga koji uzrokuje pokretanje PHP interpretera.

Ako razmislite o čemu tekstualnu datoteku- ovo je sadržaj i struktura od programera, PHP datoteka je sintaksa interpretatora plus logika programera, a "označeni" opisi html, css, xml su više semantički elementi, ali regulirani statičkim standardima. Može se doći do zaključka da je vjerovatno vrijeme da fajlovi dobiju novi sadržaj, a to bi samo po sebi trebalo da odredi njihov kvalitet i logiku korištenja. Upravo zato što programiranje još nije spremno za sljedeću fazu svog razvoja, datoteke danas ostaju samo datoteke koje programer kreira i određuje njihovu upotrebu.

Najinteresantnije i najperspektivnije je kada PHP samostalno čita PHP fajl kada se ukaže potreba. A jednostavan PHPčitanje reda iz datoteke rezultira stvaranjem objekta, barem u stanju u kojem je sačuvan. Ovo nisu sasvim poznate ideje, ali in savremeni svet sve se tako brzo menja.

Kada proučavate ovu temu, morate uzeti u obzir da je za pristup datoteci potrebno samo PHP funkcije koriste deskriptor datoteke, dok drugi koriste putanju datoteke.

Čitanje iz datoteke

Funkcija fread() može se koristiti za dohvaćanje određene količine podataka iz datoteke.

fread (fajl, dužina)

Opcije:

fajl - deskriptor fajla

dužina - veličina podataka u bajtovima

Ako se dostigne kraj datoteke prije nego što funkcija pročita navedenu veličinu podataka, vratit će manji niz. Ova funkcija pogodan za čitanje binarnih datoteka.

Prilikom određivanja dužine reda i pomicanja pokazivača, morate uzeti u obzir da ruska slova nisu veličine jednog bajta, već veća. u temi "Rad sa stringovima". Također zapamtite da postoji nekoliko bajtova na početku UTF-8 kodirane datoteke. UTF-8 kodiranje bez BOM-a nema ove bajtove.

Hajde da prvo pročitamo 10 bajtova iz datoteke myfile.txt. Otvorimo ga u "r+" modu. Pokazivač će biti na početku.

$file = fopen("myfile.txt", "r+"); $take = fread($fajl, 10); echo $take;

Ako datoteka sadrži ruska slova, posljednje slovo možda neće biti ispravno prikazano. To se dešava zato što je znak veći od jednog bajta i jedan dio se čita, a drugi nije.

Funkcija fgets() vraća jedan string, počevši od pokazivača do kraja stringa.

fgets (fajl, dužina)

Opcije:

fajl - deskriptor fajla

dužina - omogućava vam da odredite veličinu stringa u bajtovima. U ovom slučaju, ako se dostigne kraj reda, onda sljedeći red nije uključen u rezultat funkcije, čak i ako je linija manja od navedene dužine. Opcioni parametar.

Ako dužina nije navedena, tada je u starijim verzijama PHP-a maksimalna dužina vraćenog niza bila ograničena. Novije verzije nemaju ovo ograničenje.

Pokretanje funkcije u petlji omogućava vam čitanje datoteke red po red.

Hajde da pročitamo jedan red iz datoteke myfile.txt. Pošto je pokazivač već pomeren, neće se čitati ceo red, već iz pokazivača.

$take = fgets($file); eho"
".$take;

Funkcija fgetss() također vraća jedan string, ali uklanja HTML oznake iz njega. Ako u kodu postoji PHP skripta, ona će također biti izbrisana.

fgetss (fajl, dužina, potrebne oznake)

Opcije:

fajl - deskriptor fajla

dužina - veličina niza u bajtovima. Opcioni parametar.

potrebne oznake - omogućava vam da odredite oznake koje se neće izbrisati.

Postoji funkcija fgetc() koja vraća jedan znak iz datoteke.

Funkcija file() čita cijelu datoteku i stavlja podatke u niz. Svaki niz se stavlja u element niza. Ne morate otvarati datoteku da bi ova funkcija radila. Lokacija pokazivača se ne uzima u obzir.

fajl (putanja datoteke, zastavice, kontekst)

Opcije:

put datoteke - apsolutna ili relativna putanja do datoteke

zastavice - zastavice koje određuju rad funkcije. Opcioni parametar.

kontekst - omogućava vam da navedete resurs konteksta

Možete odrediti sljedeće zastavice:

FILE_USE_INCLUDE_PATH - omogućava vam da tražite datoteku u folderima uključenih putanja.

FILE_IGNORE_NEW_LINES - uklanja znak na kraju reda. Ako ova zastavica nije postavljena, tada će svaki red sadržavati znak za kraj linije.

FILE_SKIP_EMPTY_LINES - ne dodaje prazne linije u niz.

Ako je navedeno nekoliko zastavica, one su odvojene operatorom "|".

Hajde da prikažemo datoteku myfile.txt na stranici.

$ar = file("myfile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); eho"
"; print_r($ar);

Pišite u fajl

Funkcija fwrite() zapisuje podatke u datoteku.

fwrite (fajl, podaci, dužina)

Opcije:

fajl - deskriptor fajla

podaci - podaci koji se snimaju

dužina - maksimalna veličina snimljenih podataka u bajtovima. Ne može se napisati cijeli red, već samo određeni broj bajtova. Opcioni parametar.

Ako je pokazivač na početku ili sredini datoteke, funkcija zamjenjuje znakove u datoteci novim. To jest, ako je napisano 5 znakova, tada se 5 znakova briše iz datoteke i na njihovo mjesto se dodaju novi.

Kada zapisujete ruska slova, kodiranje skripte mora odgovarati kodiranju datoteke.

Napišimo redak "tekst iz skripte" u datoteku. U našem primjeru, deskriptor je u sredini datoteke i linija će biti upisana tamo. Kada trebate dodati podatke na kraj datoteke, možete je otvoriti u "a" načinu. A kada treba da prepišete datoteku, ona se otvara u "w" modu. Nećemo pomerati pokazivač, već ćemo podatke zapisati tamo gde se nalaze.

$text = "tekst iz skripte"; fwrite($fajl, $tekst);

O korištenju funkcija fopen, fclose, feof, fgets, fgetss i fscanf

Hajde da navedemo sve mogućnosti

Jedna od prednosti rada sa modernim programskim jezicima kao što je PHP je broj dostupnih funkcija. PHP bi lako mogao usvojiti Perlov moto, "Postoji više od jednog načina da se nešto uradi", posebno kada je u pitanju obrada datoteka. Ali s mnoštvom dostupnih alata, postavlja se pitanje koji je najbolji za obavljanje posla. Naravno, odgovor na ovo pitanje zaista ovisi o tome koji su vaši ciljevi prilikom obrade datoteke, tako da je učenje svih mogućnosti jezika vrijedno vašeg vremena.

Tradicionalne fopen metode

Fopen metode su vjerovatno najpoznatije C i C++ programerima iz prošlosti, jer su manje-više alati koji su vam godinama bili na dohvat ruke ako ste radili sa tim programskim jezicima. Za bilo koju od ovih metoda, slijedite standardnu ​​proceduru, koristeći fopen da otvorite datoteku, funkciju za čitanje podataka, a zatim fclose da zatvorite datoteku, kao što je prikazano u Listingu 1.

Listing 1. Otvaranje i čitanje datoteke koristeći fgets
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( $line = fgets($file_handle); echo $line; ) fclose($file_handle);

Iako su ove funkcije poznate većini iskusnih programera, dopustite mi da analiziram kako rade. U stvarnosti slijedite ove korake:

  1. Otvorite fajl. $file_handle pohranjuje vezu do samog fajla.
  2. Provjerite jeste li stigli do kraja datoteke.
  3. Nastavite čitati datoteku dok ne dođete do kraja, ispisujući svaki red koji pročitate.
  4. Zatvorite fajl.

Imajući to na umu, pogledat ću svaku funkciju datoteke koja se ovdje koristi.

fopen funkcija

Funkcija fopen uspostavlja vezu sa datotekom. Kažem "uspostavlja vezu" jer, osim otvaranja datoteke, fopen može otvoriti i URL:

$fh = fopen("http://127.0.0.1/", "r");

Ova linija programa kreira vezu do gornje stranice i omogućava vam da je počnete čitati kao lokalnu datoteku.

Bilješka: Opcija "r" koja se koristi u fopen označava da je datoteka otvorena samo za čitanje. Budući da pisanje u datoteku nije uključeno u opseg pitanja o kojima se raspravlja u ovom članku, neću navoditi sve moguće vrijednosti parametra. Međutim, trebate promijeniti "r" u "rb" ako čitate iz binarnih datoteka radi kompatibilnosti na više platformi. Ispod je primjer ove vrste.

feof funkcija

Naredba feof određuje da li je čitanje stiglo do kraja datoteke i vraća True ili False. Petlja prikazana u nastavlja se do kraja datoteke "myfile". Imajte na umu da feof također vraća False ako čitate URL i veza istekne jer nema više podataka za čitanje.

Funkcija fclose

Preskočimo sredinu Listinga 1 i idemo do kraja; fclose radi suprotno od fopen: zatvara vezu sa datotekom ili URL-om. Nakon izvršavanja ove funkcije, više nećete moći čitati iz datoteke ili utičnice.

fgets funkcija

Vraćajući se nekoliko redova unazad u Listingu 1, dolazite do srži procesa obrade datoteke: zapravo čitanje datoteke. Funkcija fgets je vaše oružje izbora za prvi primjer. On hvata red podataka iz datoteke i vraća ga kao string. Odatle možete prikazati podatke ili ih na drugi način obraditi. Primjer u Listingu 1 ispisuje cijelu datoteku.

Ako odlučite ograničiti veličinu dijela podataka s kojim radite, možete dodati argument fgets da ograničite maksimalnu dužinu niza podataka koji se snima. Na primjer, koristite sljedeći kod da ograničite dužinu reda na 80 znakova:

$string = fgets($file_handle, 81);

Zamislite "\0", indikator kraja reda u C, i postavite dužinu na jedan znak dužu nego što vam je zapravo potrebno. Kao što vidite, gornji primjer koristi 81, dok vam je potrebno 80 znakova. Neka vam postane navika dodavanje dodatnog znaka kad god trebate postaviti ograničenje dužine reda za datu funkciju.

fread funkcija

Funkcija fgets je samo jedna od mnogih funkcija dostupnih za čitanje datoteke. Ovo je jedna od najčešće korištenih funkcija, budući da obrada datoteke red po red u većini slučajeva ima najviše smisla. U stvari, nekoliko drugih funkcija nudi slične mogućnosti. Kako god bilo, analiza linija po red nije uvijek ono što vam treba.

I ovdje pristupamo fridu. Funkcija fread ima malo drugačiju svrhu od fgets: ona je namijenjena čitanju iz binarnih datoteka (to jest, datoteka koje se u početku ne sastoje od teksta čitljivog ljudima). Pošto koncept "linija" nije relevantan za binarne datoteke (logičke strukture podataka se obično ne razbijaju u redove), morate navesti broj bajtova za čitanje.

$fh = fopen("myfile", "rb"); $data = fread($file_handle, 4096);

Gornji primjer čita 4096 bajtova (4 KB) podataka. Imajte na umu da će, bez obzira na vrijednost koju navedete, fread čitati maksimalno 8192 bajta (8 KB).

Pod pretpostavkom da datoteka nije veća od 8 KB, programski isječak u nastavku bi trebao pročitati cijelu datoteku u jednom redu.

$fh = fopen("myfile", "rb"); $data = fread($fh, veličina datoteke("myfile")); fclose($fh);

Ako je veličina datoteke veća, morat ćete koristiti petlju da pročitate ostatak.

fscanf funkcija

Vraćajući se na obradu stringova, fscanf je također nasljednik tradicionalne funkcije biblioteke C datoteka, fscanf čita polja podataka u varijable iz datoteke.

lista ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

Nizovi formata koji se koriste u ovoj funkciji opisani su u mnogim izvorima kao što je PHP.net, tako da neću ponavljati ove informacije ovdje. Dovoljno je reći da je formatiranje stringova vrlo fleksibilno. Također treba napomenuti da su sva polja smještena u varijablu koju vraća funkcija. (U C-u bi se oni prosljeđivali kao argumenti.)

fgetss funkcija

Funkcija fgetss se razlikuje od tradicionalnih funkcija za manipulaciju datotekama i daje vam bolje razumijevanje PHP-ovih mogućnosti. Radi kao fgets, ali odbacuje sve HTML ili PHP oznake koje otkrije, ostavljajući samo goli tekst. Uzmimo HTML fajl ispod.

Listing 2. Primjer HTML datoteke
Moj naslov

Ako razumete šta znači "Cause there ain't no one for to you no pain" onda slušate previše o bendu America

Propustimo ga kroz funkciju fgetss.

Listing 3. Korištenje fgetss
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( echo = fgetss($file_handle); ) fclose($file_handle);

Ovo ćete dobiti kao izlaz:

Moj naslov Ako razumete šta znači "Cause there ain't no one for to you no pain" onda slušate previše o bendu America

fpassthru funkcija

Bez obzira na to kako čitate podatke iz datoteke, preostale podatke možete ispisati koristeći standardni izlazni kanal koristeći fpassthru funkciju.

fpassthru($fh);

Ova funkcija ispisuje podatke tako da ih ne morate stavljati u varijablu.

Nelinearna obrada datoteke: kretanje kroz datoteku

Naravno, gore opisane funkcije vam omogućavaju samo uzastopno čitanje iz datoteke. Složenije datoteke mogu zahtijevati premještanje u različite dijelove datoteke na početku ili na kraju datoteke. Da biste to učinili, potrebna vam je funkcija fseek.

fseek($fh, 0);

Gornji primjer se vraća na početak datoteke. Ako ne želite da pređete na sam početak fajla - recimo, dovoljan je jedan kilobajt - jednostavno napišite:

fseek($fh, 1024);

Od PHP V4.0, dostupno je i nekoliko drugih opcija. Na primjer, ako trebate pomaknuti naprijed 100 bajtova od svoje trenutne pozicije, možete koristiti sljedeći kod:

fseek($fh, 100, SEEK_CUR);

Isto tako, pomeranje unazad 100 bajtova se vrši:

fseek($fh, -100, SEEK_CUR);

Ako se želite vratiti na poziciju od 100 bajtova prije kraja datoteke, umjesto toga koristite SEEK_END.

fseek($fh, -100, SEEK_END);

Kada se dostigne nova pozicija, možete koristiti fgets, fscanf ili neku drugu funkciju za čitanje podataka.

Bilješka: ne možete koristiti fseek na deskriptorima datoteka koji upućuju na URL.

Snimite cijeli fajl

Sada prelazimo na neke od jedinstvenih PHP-ovih mogućnosti obrade datoteka: obradu velikih blokova podataka u jednom ili dva reda. Na primjer, kako možete uzeti datoteku i prikazati cijeli njen sadržaj na svojoj web stranici? Pa, vidjeli ste primjer korištenja petlje sa fgetovima. Ali kako to možete učiniti lakšim? Proces je gotovo smiješno jednostavan koristeći fgetcontents, koji stavlja cijeli fajl na liniju.

$my_file = file_get_contents("myfilename"); echo $my_file;

Iako ovo nije najbolja opcija, ovu naredbu možete napisati još kraće:

echo file_get_contents("myfilename");

Ovaj članak se prvenstveno fokusira na obradu lokalnih datoteka, međutim, vrijedno je napomenuti da također možete snimiti, prikazati i raščlaniti druge web stranice koristeći opisane funkcije.

echo file_get_contents("http://127.0.0.1/");

Ova komanda je zapravo ista kao:

$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);

Možda gledate ove primjere i mislite: "To je puno posla." PHP programeri se slažu sa vama. Dakle, gornju naredbu možete skratiti na:

readfile("http://127.0.0.1/");

Funkcija readfile ispisuje cijeli sadržaj datoteke ili web stranice u zadani izlazni bafer. Ova komanda podrazumevano prikazuje poruku o grešci kada ne uspe. Da biste izbjegli ovo ponašanje (ako ga želite), pokušajte naredbu:

@readfile("http://127.0.0.1/");

Naravno, ako trebate obraditi sadržaj datoteka, onda je jedan red koji vraća file_get_contents vjerovatno previše. Možda ćete želeti da ga prvo podelite na delove pomoću funkcije split().

$array = split("\n", file_get_contents("myfile"));

Ali zašto vam je potrebna sva ova složenost ako postoji savršeno prikladna funkcija koja će obaviti posao umjesto vas? PHP file() funkcija izvršava ovaj zadatak u jednom koraku: vraća niz stringova čiji su elementi linije datoteke.

$array = file("myfile");

Treba napomenuti da postoji mala razlika između dva gornja primjera. Komanda split uklanja nove redove, dok naredba file završava redove niza novim redovima (kao i fgets).

PHP-ove mogućnosti, međutim, daleko prevazilaze gore opisane. Možete raščlaniti cijele .ini datoteke u PHP stilu sa samo jednom parse_ini_file komandom. Naredba parse_ini_file primjenjuje se na datoteke slične onima prikazanim u Listingu 4.

Listing 4. Primjer .ini datoteke
; Ime komentara = Potraga za "Kralj Artur" = Potraga za svetim gralom omiljena boja = Plava Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Sljedeće naredbe predstavljaju datoteku kao niz, a zatim ispisuju niz:

$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

Rezultat će biti sljedeći izlaz:

Listing 5. Izlaz
Niz ( => Kralj Artur => Tražiti Sveti gral => Plavi => Mark Twain => Whoopi Goldberg)

Naravno, možete primijetiti da je ova komanda spojila sekcije. Ovo je zadana radnja, ali je možete lako prilagoditi korištenjem drugog argumenta parse_ini_file: process_sections, koji je Boolean varijabla. Postavite process_sections na True.

$file_array = parse_ini_file("holy_grail.ini", istina); print_r $file_array;

I vaš će rezultat izgledati ovako:

Listing 6. Izlaz
Niz ( => Niz ( => Kralj Artur => Za traženje Svetog grala => Plavo) => Niz ( => Mark Twain => Whoopi Goldberg))

PHP stavlja podatke u višedimenzionalni niz koji se lako može analizirati.

Ali ovo je samo vrh ledenog brega kada je u pitanju obrada datoteka u PHP-u. Složenije funkcije kao što su tidy_parse_file i xml_parse mogu vam pomoći da raščlanite HTML i XML dokumente, respektivno. Pogledajte odjeljak za detaljnije informacije o tome kako ove funkcije rade. I jedno i drugo je vrijedno razmotriti ako ćete raditi s ovim tipovima datoteka, ali umjesto da prolazite kroz sve moguće tipove datoteka, možda biste željeli detaljnije pogledati sadržaj ovog članka, koji ima neka dobra opća pravila za rad sa funkcijama koje sam do sada opisao.

Dobar stil programiranja

Nikada nemojte pretpostavljati da će sve u vašem programu raditi kako je predviđeno. Na primjer: šta ako je datoteka koju tražite premještena? Što ako promjena dozvole uzrokuje da ne možete čitati sadržaj datoteke? Možete unaprijed provjeriti postojanje datoteke i prava za čitanje pomoću metoda file_exists i is_readable.

Listing 7. Korištenje file_exists i is_readable
$filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) ( $fh = fopen($filename, "r"); # Obrada fclose($fh); )

Međutim, u praksi će ovaj dio programa vjerovatno biti pretjeran za vaš zadatak. Rukovanje vrijednostima koje vraća fopen je jednostavnije i preciznije.

if ($fh = fopen($filename, "r")) ( # Obrada fclose($fh); )

Budući da fopen vraća False ako ne uspije, to će osigurati da će datoteka biti obrađena samo ako se datoteka može otvoriti. Naravno, ako datoteka ne postoji ili je nečitljiva, očekivali biste da će povratna vrijednost biti negativna. Stoga je takva provjera zamka u koju padaju svi potencijalni problemi. Alternativno, možete izaći iz programa ili prikazati poruku o grešci ako se datoteka ne može otvoriti.

Kao i fopen, funkcije file_get_contents, file i readfile vraćaju False ako se datoteka ne može otvoriti ili obraditi. Funkcije fgets, fgetss, fread, fscanf i fclose također vraćaju False ako dođe do greške. Naravno, sa izuzetkom fclose , vjerovatno ste već obrađivali rezultate koje oni vraćaju. Što se tiče fclose, nema mnogo toga što se može učiniti ako se file handle ne zatvori kako treba, tako da je provjera povratne vrijednosti fclose općenito pretjerana.

Izbor je na vama

PHP nema nedostatak efikasnih načina za čitanje i raščlanjivanje datoteka. Klasične funkcije poput fread-a mogu vam pouzdano služiti većinu vremena, ili će vas možda više privući jednostavnost readfile-a ako je to ono što vam je potrebno da biste obavili posao. Izbor zaista zavisi od toga šta pokušavate da postignete.

Ako obrađujete velike količine podataka, vjerovatno će vam fscanf biti korisniji i efikasniji od, recimo, korištenja datoteke u kombinaciji sa sljedećim split i sprintf komandama. Međutim, ako jednostavno prikazujete veliku količinu teksta sa manjim promjenama, korištenje funkcija file, file_get_contents ili readfile može imati više smisla. Ovo rješenje će vjerovatno biti ispravno kada koristite PHP za keširanje ili čak kreiranje privremenog proxy servera.

PHP pruža mnoge alate za rad sa fajlovima. Upoznajte svaki od njih bolje i saznajte koji su alati najbolji za projekat na kojem radite. Nudi vam se širok izbor softverskih alata, koristite ih najefikasnije i zabavite se obrađujući svoje datoteke koristeći PHP.

Dijeli