O prezentare în profunzime a operațiilor de fișiere în PHP

În acest tutorial Tuts + Premium vom învăța cum să lucrăm cu operațiile de fișiere folosind PHP. Acesta este unul dintre subiectele cele mai fundamentale ale programării pe servere în general. Fișierele sunt utilizate în aplicații web de toate dimensiunile. Deci, să învățăm să citiți, să scrieți, să creați, să mutați, să copiați, să ștergeți fișiere și multe altele.


Previzualizare ecran



Copierea, mutarea și ștergerea fișierelor

Vom începe să învățăm mai întâi cu aceste operațiuni, deoarece acestea sunt foarte simple o linie și nu implică tratarea indicatorilor de fișiere.

Copierea unui fișier

 $ fișier = "test.txt"; $ new_file = "test_copy.txt"; copiați (fișier $, $ newfile);

Mutarea unui fișier

 $ fișier = "test.txt"; $ new_file = "test_copy.txt"; redenumi ($ file, $ newfile);

Rețineți că funcția se numește "redenumiți" și nu "mutați". Pe plan intern, redenumirea unui fișier este identică cu mutarea acestuia într-o locație nouă.

Același cod funcționează la schimbarea directorului fișierului:

 $ fișier = "test.txt"; $ new_file = "diferite / folder / test_copy.txt"; redenumi ($ file, $ newfile);

Ștergerea unui fișier

Nu există o astfel de funcție ca "șterge". Aici numim funcția "deconectare".

 $ fișier = "test.txt"; deconectați ($ file, $ newfile);

Deschiderea și citirea unui fișier

Acum este timpul să începeți să vă ocupați de unele indicații de fișiere. Există mai multe modalități de citire a conținutului unui fișier în PHP, dar vom începe mai întâi metoda cea mai de bază. Mai târziu, în articol vom afla despre metodele alternative.

Există trei funcții de fișier pe care le vom folosi aici: fopen, fread și fclose.

 $ fișier = "test.txt"; // deschideți fișierul $ fp = fopen ($ file, "r"); // citeste datele 5k din fisierul $ contents = fread ($ fp, 5000); // închide fișierul fclose ($ fp);

La deschiderea fișierului, vom include un al doilea parametru, care determină tipul de acces. În acest caz, "r" înseamnă "numai citire". Există și alte tipuri pe care trebuie să le folosim pentru a scrie și a adăuga că vom acoperi mai târziu în articol.

Cel de-al doilea lucru important pe care trebuie să-l acordăm este al doilea parametru al funcției Fread. Acest lucru determină lungimea datelor (în octeți) de citire din fișier. Pentru a citi întregul conținut al fișierului, trebuie să transmitem dimensiunea totală a fișierului. Funcția file size face trucul:

 $ fișier = "test.txt"; // deschideți fișierul $ fp = fopen ($ file, "r"); // citeste 5k date din fisierul $ contents = fread ($ fp, fileize ($ file)); // închide fișierul fclose ($ fp);

Full Screencast



Înțelegerea indicatorilor de fișiere

De când am început să lucrăm cu indicatorii de fișiere, hai să facem un moment și să încercăm să le înțelegem mai bine.

Un pointer de fișiere, cunoscut și sub denumirea de "handle", este o variabilă care se referă la un fișier. Valoarea exactă a acestei variabile este neimportantă; tot ce trebuie să știm este că arată un dosar specific. Pointerul este de obicei obținut prin deschiderea unui fișier. În PHP folosim funcția fopen.

Chiar dacă PHP are un colector excelent de gunoi care închide toți indicatorii de fișiere deschise la sfârșitul execuției unui script, se consideră o practică bună închiderea manuală a acestora utilizând funcția fclose.

 $ fp = fopen ($ fișier, 'r'); // ... // închide întotdeauna fișierele fclose ($ fp);

Poziția într-un fișier

Pointerul de fișier are de fapt mai mult decât să îndrepte spre un fișier. De asemenea, indică o poziție specifică în interiorul dosarului. În majoritatea cazurilor, când deschideți un fișier, indicatorul de fișier indică la începutul (sau poziția 0) în acel fișier. Vom aborda acest concept mai detaliat atunci când vorbim despre "căutarea" mai târziu în articol.


Scrierea unui fișier

La fel ca citirea fișierelor, există mai multe moduri de a scrie într-un fișier. În primul rând vom vedea modul de bază, iar mai târziu în articol vom examina alternativele.

Următorul cod scrie conținutul variabilei de date $ în fișierul test.txt.

 $ fișier = "test.txt"; $ date = "0123456789abc"; // deschideți fișierul pentru scriere $ fp = fopen ($ file, "w"); // scrie datele în fișierul fwrite ($ fp, $ data); // închide fișierul fclose ($ fp);

De data aceasta am folosit un steag diferit pentru deschiderea fișierului. Steagul "w" deschide fișierul pentru scriere și suprascrie toate datele existente în fișier. Dacă în fișierul test.txt există ceva, acesta va fi înlocuit cu șirul în date $.

Funcția fwrite a fost foarte simplă, tocmai am trecut pointerul de fișier și datele care urmează să fie scrise în fișier. Există un al treilea parametru opțional care determină lungimea datelor care trebuie scrise:

 $ fișier = "test.txt"; $ date = "0123456789abc"; // deschideți fișierul pentru scriere $ fp = fopen ($ file, "w"); // scrie date în fișier (numai 5 octeți) fwrite ($ fp, $ data, 5); // închide fișierul fclose ($ fp);

Dacă executați codul de mai sus, conținutul test.txt va fi doar "01234".

Crearea unui fișier nou

Exemplele de mai sus lucrează și pentru crearea de fișiere noi. Dacă fișierul test.txt nu există, acesta va fi creat automat, doar prin apelul funcției fopen.

Dacă tot ce vrei să faci este să creezi un nou fișier gol, fără a scrie nicio informație în el, acest cod va funcționa:

 $ fișier = "does_not_exist.txt"; // creează și deschide fișierul $ fp = fopen ($ file, "w"); // închide fișierul fclose ($ fp);

căutare

Actul de deplasare a locației indicatoarelor de fișiere se numește "căutare". Pentru a căuta putem folosi funcția fseek, și pentru a obține poziția unui pointer dat, putem folosi funcția ftell.

Înainte de a utiliza căutarea, să creăm un fișier cu 10 octeți de date în el.

 $ fișier = "test.txt"; $ date = "0123456789"; $ fp = fopen ($ fișier, "w"); fwrite ($ fp, $ date); fclose ($ fp);

Acum, să vedem cum se comportă aceste funcții. Iată câteva exemple diferite:

 $ fișier = "test.txt"; // deschidere pentru citire, pointer ar trebui să fie la 0 $ fp = fopen ($ file, "r"); ecou "deschis:"; // ieșiri 0 echo ftell ($ fp). "\ n"; // ----- // încearcă să octească 4 fseek ($ fp, 4); ecou "căuta 4:"; // ieșiri 4 echo ftell ($ fp). "\ n"; // ----- // puteți ieși din limitele fseek ($ fp, 9000); ecou "din limite:"; // ieșire 9000 echo ftell ($ fp). "\ n"; // ---- // acesta este modul în care ajungi la sfârșitul lui fseek ($ fp, 0, SEEK_END); ecou "sfârșitul:"; // ieșire 10 echo ftell ($ fp). "\ n"; // // // se deplasează față de poziția curentă // numerele negative lucrează fseek ($ fp, -3, SEEK_CUR); echo "du-te înapoi cu 3:"; // ieșire 7 echo ftell ($ fp). "\ n"; // ---- // sau căutați în raport cu sfârșitul // din nou, lucrările negative fseek ($ fp, -3, SEEK_END); echo "merge înapoi cu 3 de la sfârșitul anului:"; // ieșire 7 echo ftell ($ fp). "\ n"; // ---- // face același lucru ca și în cazul căutării la zero ($ fp); echo "înapoi:"; // ieșiri 0 echo ftell ($ fp). "\ n"; fclose ($ fp);

Alte operațiuni Mutarea poziției pointerului fișierului

Poziția cursorului fișierului se poate deplasa prin alte operațiuni decât fseek.

De exemplu, lectura mută poziția:

 $ fișier = "test.txt"; $ fp = fopen ($ fișier, "r"); // citirea a 6 octeți $ data = fread ($ fp, 6); // ieșiri 6 echo ftell ($ fp); fclose ($ fp);

De asemenea, scrierea se mișcă:

 $ fișier = "test.txt"; $ date = "0123456789"; $ fp = fopen ($ fișier, "w"); // scrierea a 10 octeți fwrite ($ fp, $ data); // ieșiri 10 echo ftell ($ fp); fclose ($ fp);

Moduri de acces la fișiere

Acum, că suntem familiarizați cu citirea, scrierea și căutarea de concepte, este timpul să înțelegem mai bine diferitele moduri de acces la fișiere. Când deschideți un fișier cu funcția fopen, trebuie furnizat al doilea parametru, care este modul de acces la fișiere. Există un tabel în manualul PHP care le descrie:


Privind la acestea, puteți vedea că avem mai multe opțiuni decât am vorbit până acum. Iată câțiva factori importanți care trebuie luați în considerare în alegerea opțiunii potrivite:

  • Deschiderea cu "r +" va eșua, dacă fișierul nu poate fi scris, chiar dacă doriți doar să citiți și să nu-l scrieți.
  • Ambele "w" și "w +" vor șterge complet conținutul unui fișier existent de îndată ce îl deschideți. Dacă intenționați să adăugați date, trebuie să utilizați "a" sau "a +".
  • Dacă doriți să creați fișiere noi și, de asemenea, să preveniți suprascrierea accidentală și fișierul existent, utilizați "x" sau "x +".
  • Când lucrați cu fișiere binare, cum ar fi imagini, adăugați litera "b" după modul. De exemplu: 'rb' sau 'r + b'

Obținerea informațiilor despre fișiere

Există multe fragmente de informații pe care le putem obține despre un fișier în afară de conținutul său (mărime, ultimul timp de acces, modificarea timpului etc.). Funcția principală folosită pentru acest lucru este stat.

Returnează informațiile într-o matrice:

 $ date = stat ("test.txt"); print_r ($ date); / * imprimări: Array ([0] => 2 [1] => 0 [2] => 33206 [3] => 1 [4] ] => 10 [8] => 1264374556 [9] => 1264374556 [10] => 1264373231 [ ] => 33206 [nlink] => 1 [uid] => 0 [gid] => 0 [rdev] => 2 [dimensiune] => 10 [atime] => 1264374556 [mtime] > 1264373231 [blksize] => -1 [blocuri] => -1) * /

Datele sunt în 12 exemplare și se repetă, mai întâi cu tastele numerice, apoi din nou cu tastele de șir.

Manualul PHP are un tabel care explică fiecare dintre ele:



Funcții alternative

După cum am menționat mai devreme, există și alte funcții alternative care pot fi utilizate pentru citirea și scrierea fișierelor. Hai să trecem peste unii dintre ei.

file_get_contents

Această funcție returnează întregul conținut al unui fișier dat. De asemenea, nu aveți nevoie să vă ocupați de indicii de fișiere.

 $ fișier = "test.txt"; $ contents = file_get_contents (fișier $);

Funcția acceptă încă patru parametri suplimentari așa cum sunt descriși în manualul PHP. De exemplu, pentru a citi o porțiune a fișierului, puteți seta al patrulea și al cincilea parametru:

 $ fișier = "test.txt"; // citește 5 octeți de date, începând de la octet 3 $ contents = file_get_contents ($ file, NULL, NULL, 3, 5);

fişier

Da, această funcție este pur și simplu denumită fișier și returnează tot conținutul întregului fișier. Dar de data aceasta, conținutul este împărțit într-o matrice, prin caracterul de linie nouă.

Să creați un fișier cu următorul conținut:

 abc 123 linia goală după această ultimă linie

Acum folosiți funcția:

 $ fișier = "test.txt"; $ contents = fișier (fișier $); print_r ($ cuprins); / * imprimă Array ([0] => abc [1] => 123 [2] => rândul gol după această [3] => [4]

Este posibil să nu fie evident, dar există un caracter de linie nouă pentru fiecare element de matrice. Dacă nu le doriți, puteți să le tăiați manual sau să utilizați fișierul FILE_IGNORE_NEW_LINES:

 $ fișier = "test.txt"; $ contents = fișier ($ file, FILE_IGNORE_NEW_LINES); print_r ($ cuprins); / * imprimă Array ([0] => abc [1] => 123 [2] => rândul gol după această [3] => [4]

Dacă nu vreți liniile goale fie, puteți utiliza pavilionul FILE_SKIP_EMPTY_LINES:

 $ fișier = "test.txt"; $ contents = fișier ($ file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); print_r ($ cuprins); / * imprimă Array ([0] => abc [1] => 123 [2] => linia goală după această [3] => ultima linie)

file_put_contents

Din nou, nu este nevoie să utilizați indicatori de fișiere. Această funcție scrie pur și simplu datele date fișierului dat:

 $ fișier = "test.txt"; $ date = "0123456789"; file_put_contents (fișier $, date $);

filename, fileatime, filemtime

Acestea sunt alternative la funcția stat pentru obținerea informațiilor despre fișiere.

 $ fișier = "test.txt"; // primește dimensiunea fișierului echo file size (fișier $); // primește ultima modificare a fișierului echo filemtime ($ file); // primește ultima dată când fișierul a accesat ecou fileatime ($ file);

Permisiuni de fișiere

Sistemele de tip Unix au un standard destul de detaliat pentru permisiunile de fișiere. Sistemul Windows are un pic mai simplu. Întregul subiect al permisiunilor de fișier poate fi lung și poate fi scris un întreg articol separat. Deci, în schimb, vom analiza doar două concepte simple de permisiuni de fișiere: fiind "citibile" și fiind "scriitoare".

Verificarea permisiunilor

Scriptul dvs. poate sau nu a citit și / sau a scrie accesul la un fișier din diferite motive. Înainte de a încerca să deschideți un fișier pentru citire sau scriere, este bine să verificați dacă aveți permisiunea să faceți acest lucru:

 $ fișier = "test.txt"; dacă is_readable ($ file)) fișierul este lizibil dacă (is_writable ($ file)) fișierul este scriitor

Setarea permisiunilor

Pentru a seta permisiunile unui fișier, vom folosi funcția chmod:

 $ fișier = "test.txt"; // face fișierul read-only chmod ($ file, 0444); // face fișierul lizibil și scriitor chmod ($ file, 0666);

Codul de mai sus ar trebui să funcționeze atât pe sistemele Unix, cât și pe cele Windows. Cu toate acestea, este posibil să nu puteți seta permisiunile, dacă nu dețineți fișierul sau nu aveți permisiuni în primul rând.

Pentru a înțelege mai bine permisiunile chmod și fișierele în general, puteți să verificați aceste linkuri:

  • Înțelegerea permisiunilor de fișiere pe Unix: un tutorial scurt
  • Permisiuni de fișiere și foldere în Windows
  • chmod intrare Wikipedia
  • Pagina manuală pentru chmod

Utilizând buclă pentru fișierele mari

Ultimul lucru despre care vom vorbi este un sfat rapid pentru manipularea dosarelor mari. Aceasta are implicații asupra performanței.

Cea mai ușoară cale de a citi și a scoate un fișier este următoarea:

 $ fișier = "test.txt"; echo file_get_contents (fișier $);

Dar acest lucru face ca întregul conținut al fișierului să fie încărcat în memorie. Acesta va persista atât timp cât este descărcat de către surferul web. Dacă aveți mai multe persoane care descarcă fișiere în același timp, aceasta poate consuma memoria serverelor dvs. web foarte repede.

O idee mai bună pentru manipularea acestui lucru ar fi să folosiți o buclă pentru a citi numai bucăți mici ale fișierului la un moment dat. Pentru condiția de buclă vom folosi funcția feof:

 $ fișier = "test.txt"; $ fp = fopen ($ fișier, 'r'); în timp ce (! feof ($ fp)) echo fread ($ fp, 4092);  fclose ($ fp);

Codul de mai sus va încărca doar 4kb de date simultan în memorie, ceea ce va reduce considerabil utilizarea memoriei pentru ieșirile mari de fișiere. Funcția feof se întoarce la adevărat când ajungem la sfârșitul fișierului, iar acest lucru se desprinde din bucla.

Cod