Creați, deschideți, citiți, scrieți, ștergeți și verificați existența fișierelor în PHP. Php creează fișier, citește și scrie linie de citire Php din fișier

16,5K

De fapt, cum să deschideți un fișier php nu este o problemă mare. Poate fi mai greu să deschizi o sticlă de bere când te afli în mijlocul unei păduri. Dar doar programatorii pasionați gândesc așa. Și pentru începători, vă vom spune despre toate capabilitățile PHP pentru lucrul cu fișiere:

fișiere php

Fișierele cu extensia php conțin cod scris în limbajul de programare cu același nume. Spre deosebire de alte limbi, php este un limbaj de programare pe partea de server. Adică rulează pe partea serverului. Prin urmare, pentru a-și depana codul, trebuie instalat un server local pe mașina client.

Pentru a lucra cu fișiere php, se folosesc aplicații speciale - editori de software. Cele mai frecvente sunt:

  • Dreamweaver.
  • PHPEdit.
  • Dezvoltare PHP Eclipse.
Când creați site-uri web bazate pe PHP, poate fi necesar să reutilizați codul programului. În astfel de situații, este convenabil să conectați soluții gata făcute aflate într-un alt fișier. Construcția include este folosită pentru aceasta. Sintaxa sa este:

include numele fișierului

Exemplu de conexiune:

Fișier inclus:


Includerea unui fișier este posibilă și folosind constructul require. Spre deosebire de include, acesta include fișierul înainte ca codul programului să fie executat. Folosind require în cod, este posibil un singur apel la acest fișier. Când este accesat din nou, sistemul va afișa un mesaj de eroare global și va opri execuția programului.

Construcția include include doar sursa în timpul execuției programului. Suporta citirea multiplă a fișierului php. Dacă apare o eroare, va fi afișat doar un mesaj de avertizare, iar execuția codului va continua de la următoarea linie.

Deschiderea și închiderea fișierelor

În php, toate operațiunile cu fișiere sunt efectuate în mai multe etape:

  • Deschiderea unui fișier;
  • Editare de conținut;
  • Închiderea dosarului.

Funcția fopen() este folosită pentru a deschide un fișier. Sintaxa sa este:

int fopen(nume fișier șir, mod șir [, int use_include_path])

Argumente acceptate:

  • șir nume fișier – numele fișierului sau calea absolută către acesta. Dacă calea către fișier nu este specificată, acesta va fi căutat în directorul curent. Dacă fișierul pe care îl căutați lipsește, sistemul va afișa un mesaj de eroare. Exemplu:

  • modul șir – indică modul de deschidere a fișierului. Valori acceptate de argument:
  • r – fișierul este deschis doar pentru citire, indicatorul fișierului este setat la început;
  • r+ – fișierul este deschis pentru citire și scriere;
  • w – creează un fișier nou doar pentru scriere. Dacă un fișier cu același nume există deja, toate datele din acesta sunt șterse automat;
  • w+ - creează un fișier nou pentru scriere și citire. Când un astfel de fișier există, datele sale sunt complet suprascrise cu altele noi;
  • a – fișierul este deschis pentru scriere. Indicatorul este setat la sfârșit. Adică, scrierea în fișierul php va începe nu de la început, ci de la sfârșit;
  • a+ – deschideți un fișier în modul citire-scriere. Înregistrarea va începe de la sfârșit;
  • b – modul de lucru cu un fișier care conține date binare (în sistemul de numere binar). Acest mod este disponibil numai pe sistemul de operare Windows.

Pentru a închide accesul la un fișier, utilizați funcția fclose(). Sintaxă:

int fclose (fișier int) , unde fișierul int este un handle al site-ului de închis.

După fiecare citire sau scriere, fișierul trebuie închis cu această funcție. În caz contrar, fluxul creat pentru fișier rămâne deschis. Și acest lucru duce la un consum inutil al capacității serverului.

Exemplu:

Citirea și scrierea fișierelor

Pentru a afișa pur și simplu întregul conținut al unui fișier, funcția readfile() este ideală. Sintaxa sa este:

readfile (șir nume fișier), unde șir nume fișier este numele fișierului șir (nu un handle).


Același fișier poate fi citit folosind funcția fpassthru(). Citește datele de la poziția indicatorului final până la sfârșitul fișierului. Sintaxa sa este:

int fpassthru (fișier int)

Funcția necesită deschiderea și închiderea unui fișier. Exemplu:

Rezultatul este similar cu cel precedent.

Funcțiile pentru lucrul cu fișiere în php vă permit să citiți conținutul rând cu linie și caracter cu caracter:

  • șir fgets (fișier int, lungime int)– funcția citește un șir de lungime . Exemplu:

  • string fread (fișier int, lungime int)– acțiunea este identică cu cea anterioară.

Pentru a scrie date text într-un fișier, există două funcții identice:

  • int fputs (fișier int, șir de caractere [, lungime int ])
  • int fwrite(fișier int, șir șir [, lungime int ])

Funcțiile scriu într-un fișier int fișier un șir de caractere cu lungimea specificată int lungime ( argument opțional). Exemplu:

Crearea și ștergerea fișierelor

Pentru a crea un fișier php, puteți utiliza funcția fopen() în modul de acces „w” sau „w+”. Sau funcția touch(). Setează ora de modificare a fișierului. Dacă nu există niciun element cu numele căutat, acesta va fi creat. Sintaxa sa.

şir fgets(mânerul resursei [, lungimea int])

Returnează un șir de lungime - 1 octet citit din descriptorul de fișier indicat de handle . Citirea se termină când numărul de octeți citiți atinge lungimea - 1, când ajunge la sfârșitul liniei (care este inclusă în valoarea returnată) sau când ajunge la sfârșitul fișierului (oricare vine primul). Dacă lungimea nu este specificată, valoarea implicită este de 1 kilobyte sau 1024 de octeți.

Dacă apare o eroare, funcția revine FALS .

Cele mai frecvente greșeli:

Programatori obișnuiți cu semantica funcțiilor „C”. fgets(), trebuie să ia în considerare diferența în modul în care este returnat indicatorul de sfârșit de fișier (EOF).

Indicatorul de fișier trebuie să fie valid și să trimită către un fișier deschis cu succes de funcții fopen() sau fsockopen() .

Mai jos este un exemplu simplu:


Exemplul 1. Citirea unui fișier linie cu linie

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

Cometariu: Parametrul de lungime a devenit opțional începând cu versiunea PHP 4.2.0. Dacă acest parametru este omis, se presupune că lungimea șirului este 1024. Începând cu PHP 4.3, omiterea parametrului lungime va face ca fluxul să fie citit până la sfârșitul șirului. Dacă majoritatea liniilor din fișier sunt mai lungi de 8 kiloocteți, cea mai eficientă decizie în ceea ce privește resursele utilizate de script este de a specifica o lungime maximă a liniei.

Cometariu: Această funcție poate procesa corect date binare începând cu PHP 4.3. Versiunile anterioare nu aveau această funcționalitate.

PHP a apărut mult mai târziu decât limbajele de programare și-au consolidat pozițiile și au formulat idei generale despre sintaxă, logică, variabile și alte obiecte de program. Fișierele și funcțiile pentru lucrul cu ele nu au făcut progrese și nici chiar problema codificării fișierelor, care a apărut din motive naturale, nu a condus la soluții radical noi.

Remarci generale

Principala activitate cu fișierele, oricare ar fi acestea, constă în deschidere, citire/scriere și închidere. Puteți folosi funcțiile de blocare/deblocare a accesului la un fișier în timp ce acesta este procesat, puteți seta poziția de citire/scriere în fișier - totul este la fel ca înainte, în trecutul îndepărtat.

Un punct important în PHP este abundența de funcții pentru lucrul cu fișiere și opțiuni pentru utilizarea acestora. În practică, este suficient să folosiți opțiuni simple, dar funcționale. Un fișier este, în primul rând, memoria programului. Puteți stoca informații în el. Scopul oricărui program, scopul oricărui site web este de a prezenta, procesa și asigura siguranța informațiilor.

Circumstanta esentiala

Anterior, cerința de compatibilitate, cel puțin de jos în sus, era de neclintit. Adică, un program odată scris într-o versiune a unui limbaj de programare este în mod ideal compilat/interpretat în versiunea următoare. În programarea modernă, acest lucru nu este cazul. Cerința de compatibilitate a structurilor sintactice ale unei limbi a devenit un lucru de istorie, iar lupta dintre stiluri și instrumente de programare și versiuni ale anumitor instrumente a devenit norma vieții lor.

Lucrul cu fișiere, precum și cu baze de date, este la fel de important ca și interfața site-ului. Primul ar trebui să fie construit în așa fel încât atunci când schimbați platforma, găzduirea sau versiunea lingvistică, să nu fie nevoie să schimbați codul site-ului. Interfața pentru lucrul cu fișierele trebuie să fie inclusă într-un script separat și să asigure compatibilitatea deplină, așa cum designul site-ului trebuie să se adapteze în mod adecvat oricărui dispozitiv, browser și să ofere restul funcționalității site-ului cu aceleași capabilități.

Citește și schimbă-te

Se poate schimba un program în sine, adică se poate îmbunătăți un script? Până astăzi, această întrebare îi interesează pe mulți. Dar sarcina sună mult mai practică: PHP citește un fișier PHP. Un dezvoltator nu poate rezolva întotdeauna o anumită problemă scriind un anumit cod. Uneori este necesar să-l schimbi atunci când un vizitator vine pe site și formulează o întrebare care nu a fost prevăzută în etapa de dezvoltare.

Ca și în toate celelalte cazuri, în primul rând trebuie să deschideți fișierul. Nu contează dacă acest fișier există sau nu. Dacă se știe că fișierul există (funcția file_exists() dă un răspuns pozitiv), funcția fopen() este folosită cu acces 'r', 'r+', 'a', 'a+'. Dacă fișierul nu există încă, atunci cu acces „a”, „a+”, „w”, „w+”. Rezultatul deschiderii unui fișier va fi descriptorul acestuia. Fișierul este închis cu funcția fclose().

Este convenabil să folosiți PHP pentru a citi un fișier într-o matrice atunci când nu este nevoie să îl procesați în momentul citirii.

dacă (fișier_există($fNume)) (

$aLines = fișier($fNume)

În această opțiune, fiecare linie a fișierului intră secvențial în elementul de matrice. Trebuie remarcat faptul că funcțiile file() sau file_get_contents() nu trebuie să deschidă fișierul și să-l închidă.

Când fișierul de intrare este prea mare și trebuie să găsiți doar puțină informație sau din alte motive, puteți utiliza PHP pentru a citi fișierul linie cu linie. PHP oferă posibilitatea de a face acest lucru cu funcțiile fgets() și fgetc().

$fvs = fopen($fNume, „r”)

în timp ce ((fals !== ($cLine = fgets($fvs, 2000)))) (

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

Ambele opțiuni funcționează impecabil. Cu toate acestea, atunci când efectuați citirea PHP a unui fișier PHP pentru modificarea ulterioară, trebuie luate măsuri de precauție. Nu este întotdeauna posibil să se prevadă cum îl va folosi un vizitator în etapa de dezvoltare a site-ului. Este mai bine dacă scripturile sunt modificate în cadrul funcțiilor site-ului, iar controlul acestei modificări nu este disponibil pentru vizitator, inclusiv pentru administratorul de resurse.

Salvarea rezultatelor

Informațiile primite și actualizate sunt scrise în fișier de funcția fputs() linie cu linie sau de funcția file_put_contents() ca întreg.

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

$fvs = fopen($fNume, „a”)

turmă ($fvs, LOCK_EX)

$cLine = „1 linie”. chr(10)

fputs($fvs, $cLine)

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

fputs($fvs, $cLine)

turmă ($fvs, LOCK_UN)

În opțiunea de înregistrare linie cu linie, puteți manipula datele în timpul procesului de înregistrare; în al doilea caz, șirul sau matricea scrisă este plasată în întregul fișier.

$file = " scData.php "

$cContents = file_get_contents($fișier)

// adăugarea unei intrări

$cContents .= „înregistrare nouă\n”

// scrieți fișierul înapoi

file_put_contents($fișier, $cContents)

Citirea și scrierea fișierelor PHP este ușoară și naturală. Cu toate acestea, este important de reținut: fiecare fișier are un nume, extensie și cale (dosar). Pentru ca un script PHP să poată citi și scrie fișiere, scriptul trebuie să aibă drepturile corespunzătoare. Sunt expuse automat pe găzduire, dar în unele cazuri trebuie extinse.

În unele cazuri, poate fi de dorit să se verifice rezultatele prin efectuarea unui test de citire. Scrierea fișierelor PHP necesită acest lucru în timpul dezvoltării, dar în unele cazuri, în interesul securității sau fiabilității site-ului, verificarea înregistrării datelor este esențială.

O trăsătură caracteristică PHP, MySQL, JavaScript și în special browsere: permiterea în liniște a unor erori. „Nerecunoscut, nu făcut...” nu este o practică foarte bună la vârful tehnologiei informației, dar îi învață pe dezvoltatori să nu greșească și să scrie cod curat, de înaltă calitate, ceea ce nu este rău.

PHP și lucrul cu documente reale

Citirea PHP a unui fișier PHP este cu siguranță de interes practic, dar acesta este domeniul programării. Utilizatorul și vizitatorul site-ului sunt interesați de informații cu caracter aplicativ, pe care este obișnuit să le vadă sub formă de tabele și documente, în special, în formatele de fișiere *.xlsx și *.docx. Acestea sunt fișiere în format MS Excel și MS Word.

Listele de mărfuri, prețuri, caracteristici sunt de obicei formate sub formă de tabele, așa că citirea PHP a fișierului Excel este esențială.

Bibliotecile PHPExcel și PHPWord au fost dezvoltate pentru a funcționa cu astfel de fișiere. Cu toate acestea, conținutul fișierelor *.xlsx și *.docx este prezentat în standardul OOXML, adică documentul real, ușor de înțeles este prezentat într-o arhivă zip. O arhivă Zip este un set de fișiere, inclusiv imagini, obiecte, formule și inserții din alte programe. Fișierele text aici sunt reprezentate de descrieri sub formă de etichete. Citirea unui astfel de fișier nu este suficientă; trebuie să-l analizați pentru a obține conținutul și structura pentru utilizare și modificare.

Aceasta înseamnă că operația de citire se transformă într-o procedură de deschidere a arhivei. Aceste biblioteci deschid independent arhiva de documente și oferă dezvoltatorului funcții extinse pentru citirea, procesarea și scrierea unor astfel de documente.

tabele Excel

include_once „PhpOffice/PhpExcel/IOFactory.php”

funcția scGetExcelFile($xls)(

$objPHPExcel = PHPExcel_IOFactory::load($xls)

$objPHPExcel->setActiveSheetIndex(0)

//Această matrice conține matrice de șiruri de caractere

$aSheet = $objPHPExcel->getActiveSheet()

$array = array()

//tratament

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

$cellIterator = $row->getCellIterator()

foreach($cellIterator ca $celulă)(

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

array_push($array, $element)

Citirea și procesarea fișierelor Excel este mult mai dificilă decât procesarea documentelor Word. Cea mai bună opțiune, dacă trebuie să implementați un proiect serios de citire și procesare a informațiilor aplicate, este să stăpânești mai întâi biblioteca PHPWord. Acest lucru vă va oferi o experiență bună și o înțelegere rapidă a specificului problemei.

Documente Word

Doar două rânduri:

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

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

Documentul $cFileName este acum disponibil pentru procesare. În continuare, arhiva este deschisă, este selectat și analizat conținutul acesteia, care poate fi afișat pe site, modificat și rescris.

$zipClass = nou ZipArchive()

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

// citește întregul conținut al documentului

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

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

$cNameInExt = substr($cNameIn, -4)

dacă (($cNameInExt == ".xml") || ($cNameInExt == "rels")) (

// fișierele cu extensiile „.xml” și „.xml.rels” sunt salvate în tabelul de documente

// fiecare linie xml este scrisă cu un număr unic în ordine

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

$cBodyInLen = strlen($cBodyIn)

// toate celelalte fișiere sunt scrise în folderul document așa cum sunt

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

$zipClass->getFromName($cNameIn, $cWorkPath); // conținut ca fișier

Posibilitățile oferite de PHP Excel și PHP Word vă permit să manipulați documente reale și să faceți conținutul acestora relevant în orice moment. În lumea dinamică de astăzi, acest lucru devine foarte important. Centrul de greutate s-a mutat de mult de la utilizarea locală a tehnologiei informatice la spațiul virtual de internet. Prin urmare, crearea de tabele și documente în produsele locale Microsoft este mai puțin eficientă decât lucrul cu astfel de documente în mod automat și semi-automat pe un site web, care este accesibil nu numai creatorului tabelului sau documentului, ci și consumatorilor acestuia.

Fișiere text, o altă viață

Într-o primă aproximare, fișierele text sunt mai simple decât fișierele PHP sau documentele aplicației. Cu toate acestea, este ceva de gândit aici. Operațiile de citire/scriere ale unor astfel de fișiere sunt deja indicate mai sus, dar semnificația unor astfel de fișiere este mult mai importantă.

Deoarece există un astfel de dat ca client și server (primul este dominat de JavaScript, al doilea de PHP), atunci nici mecanismele cookie și sesiunile nu pot face față nevoii de a transfera informații între scripturi, pagini sau anumite procese.

Este posibil să reflectați modificările dorite în baza de date, dar cu toate avantajele și viteza lor, fișierele text temporare sau permanente pot fi o opțiune mult mai interesantă pentru transmiterea informațiilor. Dacă nu creați o mulțime de fișiere mici și nu le controlați dimensiunea, acestea pot fi o versiune specifică și mai flexibilă a unei baze de date.

Citirea PHP a unui fișier text este rapidă, acesta poate fi parsat imediat într-o structură, matrice sau obiect. Acesta din urmă este foarte important, deoarece vă permite să creați obiecte care trăiesc în afara timpului alocat unui script PHP, care, după cum știți, poate exista doar pe server și doar în momentul în care pagina este încărcată, un răspuns AJAX este generat sau dintr-un alt motiv care determină lansarea interpretului PHP.

Dacă te gândești la faptul că un fișier text este conținutul și structura de la dezvoltator, un fișier PHP este sintaxa interpretului plus logica dezvoltatorului, iar descrierile „etichetate” html, css, xml sunt elemente mai semantice, dar reglementate. după standarde statice. Se poate ajunge la concluzia că probabil este timpul ca fișierele să dobândească conținut nou, iar acest lucru ar trebui să determine calitatea și logica lor de utilizare. Tocmai pentru că programarea nu este încă pregătită pentru următoarea etapă a dezvoltării sale, fișierele rămân astăzi pur și simplu fișiere pe care dezvoltatorul le creează și determină utilizarea lor.

Cel mai interesant și promițător lucru este atunci când PHP citește un fișier PHP independent atunci când este nevoie. Iar o simplă citire PHP a unei linii dintr-un fișier are ca rezultat crearea unui obiect, cel puțin în starea în care a fost salvat. Acestea nu sunt idei în întregime familiare, dar în lumea modernă totul se schimbă atât de repede.

Când studiezi acest subiect, trebuie să ții cont că pentru a accesa un fișier, unele funcții PHP folosesc descriptorul de fișier, iar altele folosesc calea către fișier.

Citirea dintr-un fișier

Funcția fread() poate fi folosită pentru a prelua o anumită cantitate de date dintr-un fișier.

fread (fișier, lungime)

Opțiuni:

fișier - descriptor de fișier

lungime - dimensiunea datelor în octeți

Dacă se ajunge la sfârșitul fișierului înainte ca funcția să citească dimensiunea specificată a datelor, va returna un șir mai mic. Această funcție este convenabilă de utilizat pentru citirea fișierelor binare.

Când specificați lungimea unei linii și când mutați indicatorul, trebuie să luați în considerare faptul că literele rusești nu au dimensiunea unui octet, ci sunt mai mari. în subiectul „Lucrul cu șiruri”. De asemenea, amintiți-vă că există câțiva octeți la începutul fișierului codificat UTF-8. Codificarea UTF-8 fără BOM nu are acești octeți.

Să citim mai întâi 10 octeți din fișierul myfile.txt. Să-l deschidem în modul „r+”. Indicatorul va fi la început.

$fișier = fopen("fișierul meu.txt", "r+"); $take = fread($fisier, 10); echo $take;

Dacă fișierul conține litere rusești, este posibil ca ultima literă să nu fie afișată corect. Acest lucru se întâmplă deoarece caracterul este mai mare de un octet și o parte este citită, dar cealaltă nu este.

Funcția fgets() returnează un șir, începând de la pointer până la sfârșitul șirului.

fgets(fișier, lungime)

Opțiuni:

fișier - descriptor de fișier

lungime - vă permite să specificați dimensiunea șirului în octeți. În acest caz, dacă se ajunge la sfârșitul liniei, linia următoare nu este inclusă în rezultatul funcției, chiar dacă linia este mai mică decât lungimea specificată. Parametru opțional.

Dacă lungimea nu este specificată, atunci în versiunile mai vechi de PHP lungimea maximă a șirului returnat era limitată. Versiunile mai noi nu au această limitare.

Rularea unei funcții într-o buclă vă permite să citiți un fișier linie cu linie.

Să citim o linie din fișierul myfile.txt. Deoarece indicatorul a fost deja mutat, nu va fi citită întreaga linie, ci din indicator.

$take = fgets($fisier); ecou"
„.$ia;

Funcția fgetss() returnează, de asemenea, un singur șir, dar elimină etichetele HTML din acesta. Dacă în cod există un script PHP, acesta va fi, de asemenea, șters.

fgetss (fișier, lungime, etichete necesare)

Opțiuni:

fișier - descriptor de fișier

lungime - dimensiunea șirului în octeți. Parametru opțional.

etichete necesare - vă permite să specificați etichete care nu vor fi șterse.

Există o funcție fgetc() care returnează un caracter dintr-un fișier.

Funcția file() citește întregul fișier și pune datele într-o matrice. Fiecare șir este plasat într-un element de matrice. Nu este necesar să deschideți fișierul pentru ca această funcție să funcționeze. Locația indicatorului nu este luată în considerare.

fișier (calea fișierului, steaguri, context)

Opțiuni:

calea fișierului - cale absolută sau relativă către fișier

steaguri - steaguri care determină funcționarea funcției. Parametru opțional.

context - vă permite să specificați o resursă de context

Puteți specifica următoarele steaguri:

FILE_USE_INCLUDE_PATH - vă permite să căutați un fișier în folderele include cale.

FILE_IGNORE_NEW_LINES - elimină caracterul de sfârșit de linie. Dacă acest indicator nu este setat, atunci fiecare linie va conține un caracter de sfârșit de linie.

FILE_SKIP_EMPTY_LINES - nu adaugă linii goale la matrice.

Dacă sunt specificate mai multe steaguri, acestea sunt separate prin operatorul „|”.

Să afișăm fișierul myfile.txt pe pagină.

$ar = fișier(„fișierul meu.txt”, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); ecou"
"; print_r($ar);

Scrieți la dosar

Funcția fwrite() scrie date într-un fișier.

fwrite (fișier, date, lungime)

Opțiuni:

fișier - descriptor de fișier

date - date care sunt înregistrate

lungime - dimensiunea maximă a datelor înregistrate în octeți. Nu toată linia poate fi scrisă, ci doar numărul specificat de octeți. Parametru opțional.

Dacă indicatorul se află la începutul sau la mijlocul fișierului, funcția înlocuiește caracterele din fișier cu altele noi. Adică, dacă sunt scrise 5 caractere, atunci 5 caractere sunt șterse din fișier și se adaugă altele noi în locul lor.

Când scrieți litere rusești, codificarea scriptului trebuie să se potrivească cu codificarea fișierului.

Să scriem linia „text din script” în fișier. În exemplul nostru, descriptorul se află în mijlocul fișierului și linia va fi scrisă acolo. Când trebuie să adăugați date la sfârșitul unui fișier, îl puteți deschide în modul „a”. Și când trebuie să suprascrieți un fișier, acesta este deschis în modul „w”. Nu vom muta pointerul, vom scrie datele acolo unde se află.

$text = "text din script"; fwrite($fișier, $text);

Despre utilizarea funcțiilor fopen, fclose, feof, fgets, fgetss și fscanf

Să enumerăm toate posibilitățile

Unul dintre beneficiile lucrului cu limbaje de programare moderne precum PHP este numărul de funcții disponibile. PHP ar putea adopta cu ușurință motto-ul lui Perl, „Există mai multe moduri de a face ceva”, mai ales când vine vorba de procesarea fișierelor. Dar, odată cu multitudinea de instrumente disponibile, întrebarea devine care dintre ele este cel mai bun pentru a face treaba. Desigur, răspunsul la această întrebare depinde într-adevăr de obiectivele tale atunci când procesezi fișierul, așa că învățarea tuturor capacităților limbii merită timpul tău.

Metode tradiționale fopen

Metodele fopen sunt probabil cele mai familiare programatorilor C și C++ de altădată, deoarece sunt mai mult sau mai puțin instrumentele care ți-au fost la îndemână de ani de zile dacă ai lucrat cu acele limbaje de programare. Pentru oricare dintre aceste metode, urmați procedura standard, folosind fopen pentru a deschide fișierul, o funcție pentru a citi datele și apoi fclose pentru a închide fișierul, așa cum se arată în Lista 1.

Listare 1. Deschiderea și citirea unui fișier folosind fgets
$file_handle = fopen("fișierul meu", "r"); while (!feof($file_handle)) ( $line = fgets($file_handle); echo $line; ) fclose($file_handle);

Deși aceste funcții sunt familiare celor mai mulți programatori experimentați, permiteți-mi să analizez modul în care funcționează. În realitate, urmați acești pași:

  1. Deschideți fișierul. $file_handle stochează un link către fișierul în sine.
  2. Verificați dacă ați ajuns la sfârșitul fișierului.
  3. Continuați să citiți fișierul până ajungeți la sfârșit, imprimând fiecare rând pe care îl citiți.
  4. Închideți fișierul.

Având în vedere asta, mă voi uita la fiecare funcție de fișier folosită aici.

funcția fopen

Funcția fopen stabilește o conexiune la un fișier. Spun „stabilește o conexiune” pentru că, pe lângă deschiderea unui fișier, fopen poate deschide și un URL:

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

Această linie de program creează un link către pagina de mai sus și vă permite să începeți să o citiți ca fișier local.

Notă: Opțiunea „r” utilizată în fopen indică faptul că fișierul este deschis doar pentru citire. Deoarece scrierea într-un fișier nu este inclusă în domeniul problemelor discutate în acest articol, nu voi enumera toate valorile posibile ale parametrului. Cu toate acestea, trebuie să schimbați „r” în „rb” dacă citiți din binare pentru compatibilitate între platforme. Mai jos este un exemplu de acest tip.

funcţia feof

Comanda feof determină dacă citirea a ajuns la sfârșitul fișierului și returnează True sau False. Bucla afișată în continuă până la sfârșitul fișierului „fișierul meu”. Rețineți că feof returnează și False dacă citiți o adresă URL și conexiunea expiră deoarece nu mai există date de citit.

Funcția fclose

Să sărim peste jumătatea Listingului 1 și să mergem la sfârșit; fclose face opusul fopen: închide conexiunea la fișier sau URL. După executarea acestei funcții, nu veți mai putea citi din fișier sau socket.

funcția fgets

Revenind cu câteva rânduri în Lista 1, ajungeți la inima procesului de procesare a fișierului: citirea efectivă a fișierului. Funcția fgets este arma preferată pentru primul exemplu. Preia o linie de date dintr-un fișier și o returnează ca șir. De acolo puteți afișa datele sau le puteți procesa în alt mod. Exemplul din Lista 1 tipărește întregul fișier.

Dacă decideți să limitați dimensiunea fragmentului de date cu care lucrați, puteți adăuga un argument fgets pentru a limita lungimea maximă a șirului de date care este capturat. De exemplu, utilizați următorul cod pentru a limita lungimea unei linii la 80 de caractere:

$șir = fgets($file_handle, 81);

Gândiți-vă la „\0”, indicatorul de sfârșit de linie în C și setați lungimea la un caracter mai mare decât aveți nevoie de fapt. După cum puteți vedea, exemplul de mai sus folosește 81, în timp ce aveți nevoie de 80 de caractere. Obișnuiți să adăugați un caracter suplimentar ori de câte ori trebuie să setați o limită de lungime a liniei pentru o anumită funcție.

funcția fread

Funcția fgets este doar una dintre multele funcții disponibile pentru citirea unui fișier. Aceasta este una dintre funcțiile cele mai frecvent utilizate, deoarece procesarea unui fișier linie cu linie în cele mai multe cazuri are cea mai bună sens. De fapt, câteva alte caracteristici oferă capabilități similare. Oricum ar fi, analiza linie cu linie nu este întotdeauna ceea ce aveți nevoie.

Și aici accesăm fread . Funcția fread are un scop ușor diferit de fgets: este destinată să citească din fișiere binare (adică fișiere care nu sunt inițial compuse din text care poate fi citit de om). Deoarece conceptul de „linii” nu este relevant pentru fișierele binare (structurile de date logice nu sunt de obicei împărțite în linii), trebuie să specificați numărul de octeți care trebuie citiți.

$fh = fopen("fișierul meu", "rb"); $date = fread($file_handle, 4096);

Exemplul de mai sus citește 4096 de octeți (4 KB) de date. Rețineți că, indiferent de valoarea pe care o specificați, fread va citi maximum 8192 de octeți (8 KB).

Presupunând că fișierul nu este mai mare de 8 KB, fragmentul de program de mai jos ar trebui să citească întregul fișier într-o singură linie.

$fh = fopen("fișierul meu", "rb"); $date = fread($fh, file size("fișierul meu")); fclose($fh);

Dacă dimensiunea fișierului este mai mare, va trebui să utilizați o buclă pentru a citi restul.

funcția fscanf

Revenind la procesarea șirurilor, fscanf este, de asemenea, succesorul funcției tradiționale de bibliotecă de fișiere C. Dacă nu sunteți familiarizat cu aceasta, fscanf citește câmpurile de date în variabile dintr-un fișier.

listă ($câmp1, $câmp2, $câmp3) = fscanf($fh, „%s %s %s”);

Șirurile de format utilizate în această funcție sunt descrise în multe surse precum PHP.net, așa că nu voi repeta aceste informații aici. Este suficient să spunem că formatarea șirurilor este foarte flexibilă. De asemenea, trebuie menționat că toate câmpurile sunt plasate în variabila returnată de funcție. (În C, acestea ar fi trecute ca argumente.)

funcția fgetss

Funcția fgetss este diferită de funcțiile tradiționale de manipulare a fișierelor și vă oferă o mai bună înțelegere a capacităților PHP. Funcționează ca fgets, dar elimină orice etichete HTML sau PHP pe care le detectează, lăsând doar textul gol. Să luăm fișierul HTML de mai jos.

Lista 2. Exemplu de fișier HTML
Titlul meu

Dacă înțelegi ce înseamnă „Pentru că nu există nimeni care să nu-ți facă durere”, atunci asculți prea mult din trupa America

Să-l trecem prin funcția fgetss.

Lista 3. Utilizarea fgetss
$file_handle = fopen("fișierul meu", "r"); while (!feof($file_handle)) ( echo = fgetss($file_handle); ) fclose($file_handle);

Acesta este ceea ce veți obține ca rezultat:

Titlul meu Dacă înțelegi ce înseamnă „Pentru că nu e nimeni pentru a nu te doare”, atunci asculți prea mult din trupa America

funcția fpassthru

Indiferent de modul în care citiți datele dintr-un fișier, puteți imprima datele rămase folosind canalul de ieșire standard folosind funcția fpassthru.

fpassthru($fh);

Această funcție imprimă datele, astfel încât să nu fie nevoie să le puneți într-o variabilă.

Procesare neliniară a fișierelor: deplasarea printr-un fișier

Desigur, funcțiile descrise mai sus vă permit doar să citiți dintr-un fișier secvenţial. Fișierele mai complexe pot necesita mutarea în diferite părți ale fișierului la începutul sau la sfârșitul fișierului. Pentru a face acest lucru aveți nevoie de funcția fseek.

fseek($fh, 0);

Exemplul de mai sus se întoarce la începutul fișierului. Dacă nu doriți să treceți chiar la începutul fișierului - să zicem, un kilooctet este suficient - scrieți pur și simplu:

fseek($fh, 1024);

Începând cu PHP V4.0, sunt disponibile și alte câteva opțiuni. De exemplu, dacă trebuie să avansați cu 100 de octeți față de poziția curentă, puteți utiliza următorul cod:

fseek($fh, 100, SEEK_CUR);

De asemenea, mutarea înapoi cu 100 de octeți se face prin:

fseek($fh, -100, SEEK_CUR);

Dacă doriți să reveniți la poziția de 100 de octeți înainte de sfârșitul fișierului, utilizați în schimb SEEK_END.

fseek($fh, -100, SEEK_END);

Odată ce noua poziție este atinsă, puteți utiliza fgets, fscanf sau o altă funcție pentru a citi datele.

Notă: nu puteți folosi fseek pe descriptori de fișiere care fac referire la o adresă URL.

Capturați un întreg fișier

Acum trecem la câteva dintre capacitățile unice de procesare a fișierelor ale PHP: procesarea de blocuri mari de date pe una sau două linii. De exemplu, cum puteți prelua un fișier și afișa întregul său conținut pe pagina dvs. Web? Ei bine, ați văzut un exemplu de utilizare a unei bucle cu fgets. Dar cum poți să faci asta mai ușor? Procesul este aproape ridicol de ușor folosind fgetcontents, care pune întregul fișier pe o linie.

$my_file = file_get_contents("numefișierul"); echo $fișierul_meu;

Deși aceasta nu este cea mai bună opțiune, puteți scrie această comandă și mai scurt:

echo file_get_contents("numele meu fișier");

Acest articol se concentrează în primul rând pe procesarea fișierelor locale, cu toate acestea, merită remarcat faptul că puteți captura, afișa și analiza și alte pagini Web folosind funcțiile descrise.

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

Această comandă este de fapt aceeași cu:

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

S-ar putea să te uiți la aceste exemple și să te gândești: „Este mult de muncă”. Dezvoltatorii PHP sunt de acord cu tine. Deci, puteți scurta comanda de mai sus la:

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

Funcția readfile trimite întregul conținut al unui fișier sau al unei pagini Web în memoria tampon de ieșire implicită. În mod implicit, această comandă afișează un mesaj de eroare atunci când eșuează. Pentru a evita acest comportament (dacă îl doriți), încercați comanda:

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

Desigur, dacă trebuie să procesați conținutul fișierelor, atunci singura linie returnată de file_get_contents este probabil prea mult. Poate doriți mai întâi să-l împărțiți în bucăți folosind funcția split().

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

Dar de ce ai nevoie de toată această complexitate dacă există o funcție perfect potrivită care să facă treaba pentru tine? Funcția PHP file() îndeplinește această sarcină într-un singur pas: returnează o matrice de șiruri ale cărei elemente sunt liniile fișierului.

$array = fisier("fișierul meu");

Trebuie remarcat faptul că există o mică diferență între cele două exemple de mai sus. Comanda split elimină liniile noi, în timp ce comanda fișierului încheie liniile matricei cu linii noi (la fel ca fgets).

Cu toate acestea, capacitățile PHP depășesc cu mult cele descrise mai sus. Puteți analiza fișiere .ini întregi în stil PHP cu o singură comandă parse_ini_file. Comanda parse_ini_file se aplică fișierelor similare cu cele prezentate în Lista 4.

Lista 4. Exemplu de fișier .ini
; Nume comentariu = Misiunea „Regele Arthur” = Pentru a căuta culoarea preferată a Sfântului Graal = Albastru Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Următoarele comenzi reprezintă un fișier ca o matrice și apoi tipăriți matricea:

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

Rezultatul va fi următorul rezultat:

Lista 5. Ieșire
Array ( => Regele Arthur => Pentru a căuta Sfântul Graal => Albastru => Mark Twain => Whoopi Goldberg)

Desigur, puteți observa că această comandă a îmbinat secțiunile. Aceasta este acțiunea implicită, dar o puteți personaliza cu ușurință folosind al doilea argument al parse_ini_file: process_sections, care este o variabilă booleană. Setați process_sections la True.

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

Și rezultatul dvs. va arăta astfel:

Lista 6. Ieșire
Array ( => Array ( => Regele Arthur => Pentru a căuta Sfântul Graal => Albastru) => Array ( => Mark Twain => Whoopi Goldberg))

PHP pune datele într-o matrice multidimensională ușor de analizat.

Dar acesta este doar vârful aisbergului când vine vorba de procesarea fișierelor în PHP. Funcții mai complexe, cum ar fi tidy_parse_file și xml_parse, vă pot ajuta să analizați documente HTML și, respectiv, XML. Consultați secțiunea pentru informații mai detaliate despre cum funcționează aceste funcții. Ambele merită luate în considerare dacă veți lucra cu aceste tipuri de fișiere, dar în loc să parcurgeți toate tipurile de fișiere posibile, este posibil să doriți să aruncați o privire mai atentă la conținutul acestui articol, care are câteva reguli generale bune pentru lucrând cu funcțiile pe care le-am descris până acum.

Stilul de programare bun

Nu presupuneți niciodată că totul din programul dvs. va funcționa conform intenției. De exemplu: ce se întâmplă dacă fișierul pe care îl căutați a fost mutat? Ce se întâmplă dacă o modificare a permisiunii vă face să nu puteți citi conținutul unui fișier? Puteți verifica existența unui fișier și drepturile de a-l citi în avans folosind metodele file_exists și is_readable.

Lista 7. Utilizarea file_exists și is_redable
$filename = "fișierul meu"; if (fișier_există($nume fișier) && este_lizibil ($nume fișier)) ($fh = fopen($nume fișier, "r"); # Procesare fclose($fh); )

Cu toate acestea, în practică, această bucată de program va fi probabil exagerată pentru sarcina dvs. Manipularea valorilor returnate de fopen este mai simplă și mai precisă.

if ($fh = fopen($nume fișier, "r")) ( # Se procesează fclose($fh); )

Deoarece fopen returnează False dacă eșuează, acest lucru va asigura că fișierul va fi procesat numai dacă fișierul poate fi deschis. Desigur, dacă fișierul nu există sau este imposibil de citit, te-ai aștepta ca valoarea returnată să fie negativă. Prin urmare, o astfel de verificare este o capcană în care cad toate problemele potențiale. Alternativ, puteți ieși din program sau puteți afișa un mesaj de eroare dacă fișierul nu poate fi deschis.

La fel ca fopen, funcțiile file_get_contents, file și readfile returnează False dacă fișierul nu poate fi deschis sau procesat. Funcțiile fgets, fgetss, fread, fscanf și fclose returnează, de asemenea, False dacă apare o eroare. Desigur, cu excepția fclose , probabil că ați procesat deja rezultatele pe care le returnează. În ceea ce privește fclose , nu se pot face multe dacă mânerul fișierului nu se închide corect, așa că verificarea valorii de returnare a fclose este în general exagerată.

Alegerea este a ta

PHP nu are lipsă de modalități eficiente de a citi și analiza fișiere. Funcțiile clasice precum fread vă pot servi în mod fiabil de cele mai multe ori, sau puteți fi mai atras de simplitatea readfile dacă asta este ceea ce aveți nevoie pentru a finaliza treaba. Alegerea depinde într-adevăr de ceea ce încercați să realizați.

Dacă procesați cantități mari de date, probabil veți găsi fscanf mai util și mai eficient decât, să zicem, utilizarea fișierului în combinație cu comenzile ulterioare split și sprintf. Dacă pur și simplu afișați o cantitate mare de text cu modificări minore, totuși, utilizarea funcțiilor fișier , file_get_contents sau readfile poate avea mai mult sens. Această soluție va fi probabil corectă atunci când utilizați PHP pentru stocarea în cache sau chiar pentru crearea unui server proxy temporar.

PHP oferă multe instrumente pentru lucrul cu fișierele. Cunoaște-te pe fiecare mai bine și află care instrumente sunt cele mai bune pentru proiectul la care lucrezi. Vi se oferă o gamă largă de instrumente software, utilizați-le cel mai eficient și distrați-vă procesând fișierele folosind PHP.

Acțiune