s1b5bs
<titlu>
Lucrul cu fisiere si cataloage</titlu>
<titlu>Scopuri</titlu>
• invatati modul de functionare a sistemului de fisiere UNIX
• invatati sa obtineti informatii despre fisiere si cataloage
• invatati sa cititi si sa scrieti fisiere
• invatati sa configurati permisiuni de fisiere si cataloage
• invatati sa incarcati, sa copiati, sa stergeti si sa modificati
denumirea fisierelor
• invatati sa creati si sa stergeti cataloage
• invatati sa cititi cataloage si sa navigati in acestea
Acest modul explica facilitatile oferite de PHP pentru lucrul cu fisiere si
cataloage. Fisierele si cataloagele va permit sa stocati date in server,
astfel incat datele sa poata fi retinute si sa fie accesibile de
catre mai multi utilizatori.
<titlu>Sistemul de fisiere UNIX</titlu>
Pentru a intelege cum trebuie utilizat limbajul PHP pentru a lucra cu
fisiere si cataloage, trebuie sa intelegeti sistemul de fisiere UNIX.
Acest fapt este valabil chiar daca folositi PHP sub Microsoft Windows, deoarece
modelul folosit de PHP pentru lucrul cu fisiere si cataloage este bazat pe UNIX.
Aceasta sectiune explica sistemul de fisiere UNIX si modul de utilizare a comen¬zilor
UNIX pentru lucrul cu fisiere si cataloage. Daca lucrati cu Microsoft Windows,
in general comenzile date in aceasta sectiune nu vor functiona corect.
Totusi, in mediul respectiv veti lucra cu fisiere si cataloage folosind
cu precadere Windows Explorer, nu DOS. Deci probabil ca nu este necesar sa cunoasteti
comenzile DOS similare comenzilor UNIX explicate in aceasta sectiune.
<sugestie>
Pentru a putea lucra cu fisiere si cataloage, trebuie sa deschideti sesiunea
de lucru pe sistemul unde sunt rezidente acestea. Daca nu aveti acces la o consola
locala, puteti avea acces la sistem prin intermediul Telnet sau SSH, doua protocoale
Internet cu o larga utili¬zare. Pentru a afla care este modul de acces la
fisierele si cataloagele unui sistem, apelati la administratorul sistemului
respectiv. </sugestie>
<titlu>Lucrul cu fisiere UNIX</titlu>
Un fisier este o serie de octeti stocati pe o unitate de hard-disc, CD-ROM sau
alt mediu. Fisierele primesc nume pentru a se putea face cu usurinta referire
la acestea. Un nume de fisier UNIX poate avea o lungime aproape nelimitata si
poate include aproape orice caracter. Totusi, se recomanda utilizarea unor nume
de fisiere care fie suficient de scurte pentru a putea fi tastate cu usurinta
si care sa includa numai caractere vizibile, care nu au nici o semnificatie
speciala pentru interpretorul UNIX. Spre deosebire de numele de fisiere Microsoft
Windows, numele de fisiere UNIX sunt sensibile la diferenta intre majuscule
si minuscule; ca atare, a si A se refera la fisiere UNIX diferite. Pentru a
evita problemele, mai ales atunci cand deplasati fisiere intre UNIX
si Windows, trebuie sa folositi minuscule, cifre, puncte, caractere de subliniere
si cratime in numele fisierelor; de asemenea, numele fisierelor trebuie
sa inceapa cu o minuscula sau cu o cifra.
<remarca>
Un octet este aproximativ identic cu un caracter. Totusi, limbile (nu limbajele)
care contin in alfabetul lor numeroase caractere pot necesita mai multi
octeti pentru reprezentarea unui caracter. Deseori, aceasta diferenta este lipsita
de importanta. </remarca>
<titlu>Vizualizarea informatiilor despre fisiere</titlu>
Pentru a vizualiza informatii care descriu un fisier, emiteti comanda
ls -l nume_fisier
unde nume_fisier este numele fisierului. Figura 11-1 prezinta datele de iesire
caracteristice ale comenzii ls.
Datele de iesire includ urmatoarele campuri:
• Tipul fisierului si permisiuni: tipul fisierului si permisiunile de
acces. Aceste caracteristici ale fisierului sunt descrise in sub-sectiunile
intitulate „Tipuri de fisiere" si „Privilegii de fisier".
• Legaturi: numarul legaturilor hard asociate acestui fisier. Fiecare
legatura hard stabileste un nume dupa care este cunoscut fisierul respectiv,
in general, puteti ignora acest camp.
• Utilizator: Numele utilizatorului care este posesorul fisierului.
• Grup: Numele grupului care este posesorul fisierului.
• Dimensiunea fisierului: dimensiunea fisierului, exprimata in octeti.
• Data modificarii: data si ora ultimei modificari a fisierului. Daca
fisierul nu a suferit modificari recente, vor fi afisate data si anul.
• Numele fisierului: numele atribuit fisierului.
<titlu>Vizualizarea unui fisier</titlu>
Pentru a vizualiza continutul unui fisier, emiteti comanda
more nume_fisier
unde nume_fisier este numele fisierului, in cazul in care fisierul
contine mai multe linii decat poate accepta ecranul sau fereastra, comanda
more afiseaza numai numa¬rul liniilor care se incadreaza in
ecran, respectiv fereastra. Pentru a parcurge fisierul inainte, apasati
pe tasta spatiu. Pentru a parcurge fisierul in sens invers, tastati litera
b. Pentru a parasi comanda, tastati litera q.
<figura 11-1 Datele de iesire ale comenzii ls>
*continut
*explicatie
*-rw-r--r- *Tip si permisiuni
*l
*Legaturi
*root
*Utilizator
*root
*Grup
*86
*Dimensiunea fisierului
*mar 25 15:08
*Data modificarii
*networks.txt
*Numele fisierului
</figura 11-1>
<sugestie> Datele de iesire ale comenzii more vor fi inteligibile numai
daca fisierul contine date in format ASCII. Pentru a vizualiza un fisier
binar, puteti folosi comanda od. </sugestie>
<titlu>Editarea unui fisier</titlu>
UNIX accepta o varietate de editoare pe care le puteti folosi pentru a edita
un fisier, intrebati-1 pe administratorul de sistem care sunt editoarele
disponibile in sistemul dumneavoastra. Un editor preferat de numerosi
incepatori este Pico, editor asociat cu popularul program client de e-mail
Pine. Pico include documente de asistenta incorporate si este usor de
invatat si utilizat. De asemenea, datorita aso¬cierii sale cu Pine,
Pico se gaseste pe numeroase sisteme UNIX.
Pentru a edita un fisier folosind Pico, emiteti comanda
Pico nume_fisier
unde nume_fisier este numele fisierului pe care doriti sa-1 editati. Daca doriti
sa creati un fisier nou, pur si simplu omiteti numele fisierului. Ecranul editorului
Pico se prezinta ca pe pagina urmatoare.
Pico prezinta numeroase comenzi utile, afisandu-le in ultimele doua
linii ale ecranului sau. Fiecare comanda este emisa mentinand apasata
tasta CTRL si apasand o tasta literala. Pico noteaza aceasta conventie
prin prefixarea literei care simbo¬lizeaza comanda cu un caracter de tip
accent circumflex (^). Tabelul 11-1 descrie numeroase comenzi Pico utile.
<ecran>
192.168.1.0
192.168.2.0
192.168.3.0
10.0.1.0
10.0.2.0
10.1.0.0|
<optiuni> Get Help,exit, WriteOut ,Justify,read file, where is, prev pg,
next pg, cut text, uncut text, cur pos, to spell</optiuni></ecran>
<titlu>Stergerea unui fisier</titlu>
Pentru a sterge un fisier, emiteti comanda
rm nume_fisier
unde nume_fisier este numele fisierului.
<Atentie>
Spre deosebire de Windows, UNIX nu salveaza, in general, fisierele sterse
intr-un asa-zis „recipient de reciclare" (Recycle Bin). Ca
atare, stergerea unui fisier UNIX este, in general, un act irevocabil.
<titlu>Copierea unui fisier</titlu>
Pentru a copia un fisier, emiteti comanda
cp fisier_vechi fisier_nou
<tabel 11-1 Comenzi utile ale editorului Pico>
*Comanda
*Descriere
*CTRL-C
*Afiseaza pozitia curenta a cursorului (numarul liniei si al coloanei)
*CTRL-G
*Afiseaza documentele de asistenta Pico.
*CTRL-J
*Aliniaza paragraful curent.
*CTRL-K
*Taie linia curenta.
*CTRL-O
*Scrie pe disc continutul bufferului de editare.
*CTRL-R
*Citeste un fisier in bufferul de editare.
*CTRL-T
*Lanseaza utilitarul de verificare ortografica al editorului Pico.
*CTRL-U
*Lipeste text.
*CTRL-V
*Deplaseaza textul inainte.
*CTRL-W
*Cauta text.
*CTRL-X
*Paraseste programul Pico. Programul va afisa un prompt daca bufferul editare
nu a fost salvat.
*CTRL-Y
*Deplaseaza textul inapoi.
</tabel 11-1>
unde fisier_vechi este numele fisierului pe care doriti sa-1 copiati (fisierul
sursa), iar fisier_nou este numele pe care doriti sa-1 repartizati copiei (fisierul
destinatie). Comanda cp nu afecteaza fisierul sursa.
<Atentie>
In functie de configuratia unui sistem UNIX, este posibil ca prin comanda
cp sa se suprascrie un fisier existent. Nu uitati sa evitati suprascrierea accidentala
a unui fisier important. </Atentie>
<titlu>Modificarea numelui unui fisier</titlu>
Pentru a modifica numele unui fisier, emiteti comanda
mv fisier_vechi fisier_nou
unde fisier_vechi este numele curent al fisierului, iar fisier_nou este numele
dorit.
<sugestie>
Unele sisteme UNIX interzic utilizatorilor sa modifice numele fisierului de
la un dispozitiv sau partitie la alta. Pentru a afla care sunt restrictiile
in vigoare in sistemul dumneavoastra, luati legatura cu administratorul
de sistem.</sugestie>
<titlu>Tipurile fisierelor</titlu>
Figura 11-1 a prezentat datele de iesire caracteristice ale comenzii ls. Primul
camp al datelor de iesire indica tipul fisierului si privilegiile asociate
acestuia. Primul caracter al campului indica tipului fisierului. Intre
valorile posibile se numara urmatoarele:
<tabel>
*Tip
*Descriere
* *Fisier normal
*b
* Fisier de dispozitiv, incapabil de transferuri in bloc
*d
*Catalog
*l
*Legatura simbolica
*p
*Canal denumit (fifo)
*s
*Soclu
</tabel>
Cele mai importante tipuri de fisiere sunt fisierul normal si catalogul. Celelalte
tipuri de fisiere au destinatii care nu necesita atentia noastra imediata.
<titlu>Proprietatea asupra fisierelor</titlu>
Fiecare fisier are un cont de utilizator asociat, cunoscut sub numele de posesor
al fisierului. Puteti determina posesorul unui fisier prin emiterea comenzii
ls. Utilizatorul care creeaza un fisier devine posesorul fisierului. Cu toate
acestea, un administrator de sistem poate atribui un fisier unui alt utilizator,
prin emiterea comenzii chown.
Administratorii de sistem UNIX pot defini grupuri de utilizatori, sau pur si
simplu grupuri, care reprezinta seturi de utilizatori. Un utilizator poate fi
membru al unui numar oricat de mare de grupuri.
Fiecare fisier are un grup asociat, cunoscut sub numele de grupul posesor al
fisie¬rului. Puteti determina grupul posesor al unui fisier prin emiterea
comenzii ls. Unele sisteme UNIX configureaza in mod automat un grup privat
asociat fiecarui utilizator. Pe asemenea sisteme, posesorul si grupul posesor
al unui fisier au, in mod normal, acelasi nume.
Posesorul unui fisier poate atribui unui fisier un nou grup posesor prin emiterea
comenzii chgrp, care are urmatoarea forma: chgrp grup nume_ fisier unde nume_fisier este numele fisierului, iar grup este numele grupului. In
afara de calitatea de posesor al fisierului, utilizatorul care emite comanda
trebuie sa fie un membru al grupului grup.
<titlu>Privilegii de fisier</titlu>
Privilegiile asociate unui fisier determina operatiile pe care utilizatorii
le pot efectua cu fisierul respectiv. Puteti determina privilegiile asociate
unui fisier prin emiterea comenzii ls. Asa cum se poate vedea in figura
11-1, primul camp din datele de iesire ale comenzii ls indica tipul si
privilegiile unui fisier. Primul caracter al campului indica tipul fisierului;
celelalte noua indica privilegiile.
Privilegiile sunt date sub forma a trei grupuri alcatuite din cate trei
caractere fiecare; cu alte cuvinte, trei triade. Prima triada indica privilegiile
acordate poseso¬rului fisierului. Cea de-a doua triada indica privilegiile
acordate membrilor gru¬pului care este posesorul fisierului. Cea de-a treia
triada indica privilegiile acordate altor utilizatori, cu alte cuvinte, persoanelor
care nu sunt nici posesoare ale fisierului si nici nu sunt membre ale grupului
care este posesorul fisierului. De exemplu, sa presupunem ca primul camp
al datelor de iesire ale comenzilor ls se prezinta astfel:
-rwxr-xr--
Ignorand primul caracter, care reprezinta tipul fisierului, aceste date
de iesire reflecta urmatoarele privilegii:
• posesor, rwx
• membru al grupului, r - x
• alte persoane, r- Fiecare caracter al unei triade de privilegii poate fi o litera sau o cratima.
Literele au urmatoarele semnificatii:
• r, fisierul poate fi citit
• w, se poate scrie in fisier
• x, continutul fisierului poate fi executat
<remarca>
Privilegiul x este semnificativ numai pentru fisierele care includ un continut
executabil, cum sunt fisierele binare executabile sau anumite categorii de scripturi.</remarca>
Caracterele unei triade apar intotdeauna in secventa rwx. Daca
o anumita litera este inlocuita de o cratima, privilegiul asociat nu este
utilizabil. De exemplu, sa examinam privilegiile specificate anterior:
-rwxr-xr--
Aceste caractere au urmatoarea semnificatie:
• rwx, posesorul fisierului poate citi, scrie sau executa fisierul
• r-x, membrii grupului posesor al fisierului pot citi sau executa fisierul,
dar nu pot scrie in fisier
• r- -, alti utilizatori pot citi fisierul, dar nu pot scrie in
fisier sau executa continutul fisierului
Posesorul unui fisier poate modifica privilegiile asociate fisierului emitand
comanda chmod. Aceasta comanda are doua forme. O forma va permite sa speci¬ficati
privilegiile folosind cifre scrise in octal; cealalta va permite sa le
specificati folosind litere.
Pentru a specifica privilegiile folosind cifre in octal, calculati valoarea
numerica a fiecarei triade. Pentru aceasta, insumati numerele corespunzatoare
fiecarui privilegiu disponibil din cadrul triadei. Numerele asociate privilegiilor
sunt urmatoarele:
<tabel>
*Privilegiu
*Valoare
*R
*4
*W
*2
*X
*1
</tabel>
De exemplu, privilegiul rwx are valoarea 4 + 2+1=7. Similar, privilegiul r-x
are valoarea 4 + l = 5, iar privilegiul r- - are valoarea 4. Dupa ce ati calculat
valoarea numerica a fiecarei triade, formati un numar din trei cifre scris in
octal, care este alcatuit din valoarea numerica a privilegiilor utilizatorilor,
valoarea numerica a privilegiilor membrilor grupului, respectiv valoarea numerica
a privilegiilor altor utilizatori. De exemplu, privilegiile rwxr-xr-- corespund
valorii in octal 754.
Forma comenzii chmod care foloseste cifre in octal este urmatoarea:
chmod mod nume_fisier
unde mod este numarul din trei cifre scris in octal care indica privilegiile,
iar nume_fisier este numele fisierului caruia urmeaza a i se aplica privilegiile.
De exem¬plu, pentru a acorda posesorului acces complet la fisierul test
si pentru a acorda altor utilizatori numai acces de citire, emiteti comanda:
chmod 744 test
Majoritatea utilizatorilor gasesc mai comoda utilizarea acelei forme a comenzii
chmod care le permite specificarea privilegiilor folosind litere. Aceasta forma
alternativa va permite sa specificati privilegii, precum si sa adaugati sau
sa extrageti privilegii dintr-un fisier. Iata sintaxa formei alternative:
chmod utilizatori operatie privilegii
intre argumentele comenzii nu sunt permise spatii. Argumentul utilizatori
include intre una si trei dintre urmatoarele litere:
• u, care indica utilizatorul posesor al fisierului
• g, care indica pe membrii grupului posesor al fisierului
• o, care indica utilizatori altii decat posesorul si membrii grupului
posesor
Argumentul operatie este unul din urmatoarele:
• =, care arata ca privilegiile specificate trebuie sa inlocuiasca
privilegiile existente
• +, care arata ca privilegiile specificate trebuie extinse
• -, care arata ca privilegiile specificate trebuie retrase
Argumentul privilegii include intre una si trei din urmatoarele litere:
• r, fisierul poate fi citit
• w, in fisier este permisa scrierea
• x, continutul fisierului poate fi executat
Se pot specifica mai multi utilizatori, mai multe operatii si mai multe grupuri;
fiecare specificatie trebuie separata de urmatoarea specificatie cu ajutorul
unei virgule. De exemplu, iata o comanda care instituie privilegiile rwxr--r-
- pentru fisierul test:
chmod u=rwx,g=r,o=r test
Iata o comanda care retrage privilegiile de scriere fiecarui utilizator, cu
exceptia posesorului fisierului, respectiv adauga privilegiile de executare
la privilegiile posesorului fisierului:
chmod u+x,go-w test
Aceasta comanda nu modifica nici privilegiile de citire si de scriere ale posesorului
fisierului, nici privilegiile de citire si de executie ale celorlaltor utilizatori.
<remarca>
Sistemele UNIX furnizeaza un cont special de utilizator, denumit radacina (root)
sau super-utilizator(superuser), care poate obtine acces la fisiere si le poate
manipula fara nici un fel de restrictii. Administratorul unui sistem este, in
general, singura persoana auto¬rizata sa utilizeze contul radacina.
<Sfatul specialistului>
Intrebare: Cand studiez datele de iesire ale comenzii ls, uneori
mai apar si alte privilegii in afara de r, w si x. Care este semnificatia
acestora?
Raspuns: Uneori, administratorii de sistem folosesc numeroase privilegii speciale.
De exemplu, un privilegiu special, cunoscut sub numele de setuid, modifica temporar
identitatea utilizatorului detinator al acestui privilegiu care ruleaza un fisier
program. Asemenea privilegii speciale nu sunt, in general, folosite de
programatorii aplicatiilor PHP. </Sfatul specialistului>
<titlu>Utilizarea cataloagelor UNIX</titlu>
Pentru a facilita lucrul cu fisiere, UNIX va permite sa le organizati in
cataloage, in Microsoft Windows, cataloagele sunt cunoscute sub numele
de dosare (folders). Un catalog poate contine alte cataloage, cunoscute sub
numele de sub-cataloagele acestuia; catalogul are denumirea de catalog parinte
al fiecaruia dintre sub-cataloagele sale. Cataloagele si sub-cataloagele unui
sistem UNIX formeaza un singur arbore sau ierarhie. Catalogul amplasat cel mai
sus in arbore este cunoscut sub numele de catalog radacina si se scrie
folosind simbolul /. Toate celelalte cataloage sunt sub-cataloage ale catalogului
radacina.
In mod caracteristic, catalogul radacina are sub-cataloage precum bin,
sbin, home si tmp. Calea absoluta a unui catalog este lista cataloagelor (incepand
de la catalogul radacina) care trebuie parcursa pentru a se ajunge la catalog.
Fiecare catalog din lista este separat de catalogul urmator de un caracter slash
orientat inainte (/). De exemplu, calea absoluta a sub-catalogului bin
al catalogului radacina este /bin. In cazul in care catalogul /bin
ar fi avut un sub-catalog denumit there, calea sa abso¬luta de acces ar
fi /bin/there.*
<remarca>
Sistemele Microsoft Windows folosesc caractere slash orientate inapoi
(\) pentru separarea componentelor unei cai. Cu toate acestea, versiunile pentru
Windows ale limba¬jului PHP sunt capabile de a interpreta corect o cale
specificata folosind caractere slash orientate inainte. Cu toate acestea,
daca scrieti un program PHP care prelucreaza cai de acces in format Windows,
retineti ca un caracter slash orientat inapoi care apare intr-un
sir PHP poate fi interpretat ca fiind caracterul initial al unei secvente escape.
Poate fi necesar sa inlocuiti fiecare caracter slash orientat inapoi
cu o pereche de caractere slash orientate inapoi, pentru a impiedica
limbajul PHP sa interpreteze sirul in mod eronat.
</remarca>
<nota>
*Joc de cuvinte, in limba engleza, numele catalogului bin si forma de
participiu trecut a verbului to be (a fi), in speta been, se pronunta
aproximativ asemanator. De aceea, expresia bin there se pronunta la fel cu been
there, adica am fost acolo, in engleza americana. — N.T.</nota>
Si fisierele pot avea cai absolute. Un fisier numit donethat, rezident in
catalogul /bin/there, va avea calea de acces absoluta /bin/there/donethat.*
In general, un utilizator UNIX are un catalog asociat, cunoscut sub numele
de catalog de baza al utilizatorului; in mod caracteristic, un catalog
de baza este un sub-catalog al catalogului /home. La orice moment de timp, un
program sau un interpretor de comenzi are un catalog asociat, denumit catalog
curent de lucru. Cand utilizator deschide sesiunea de lucru cu un sistem
UNIX, catalogul de baza al utilizatorului este stabilit, in general, drept
catalog curent de lucru al sesiunii.
Fisierele si sub-cataloagele pot fi desemnate relativ la catalogul curent de
lucru, nu numai prin intermediul unei cai absolute. Aceasta forma de referire
se numeste cale relativa. O cale relativa nu incepe niciodata cu un caracter
slash, deoarece prin slash se intelege catalogul radacina.
De exemplu, sa presupunem ca /home/bill este catalogul curent de lucru. Fisier
test din catalogul respectiv poate fi desemnat prin intermediul caii absolute
/home/ bill/test sau prin calea relativa test. Evident, calea relativa este
mult mai usor de tastat si, ca atare, este deseori preferata.
Din nou, sa presupunem ca /home/bill este catalogul curent de lucru, in
continuare, sa presupunem ca acest catalog contine sub-catalogul arhiva, care
include fisierul note-platite**. Fisierul poate fi desemnat cu ajutorul caii
absolute /home/bill/arhiva/note-platite sau prin intermediul caii relative arhiva/note-platite.
Fiecare catalog are doua sub-cataloage speciale, denumite .si ... Sub-catalogul
denumit . este un alias al catalogului insusi; sub-catalogul denumit ..
este un alias catalogului parinte. Puteti folosi aceste sub-cataloage speciale
pentru a forma cai relative. De exemplu, sa presupunem ca /home/bill este catalogul
curent de lucru. Puteti face referire la fisierul /home/test sub forma ../test,
deoarece simbolul .. se refera la /home, catalogul parinte al catalogului /home/bill.
<remarca>
Chiar daca un catalog radacina nu are nici un catalog parinte, contine totusi
un catalog cu numele ... In aceasta situatie speciala, catalogul .. este
un alias al catalogului radacina.</remarca>
<titlu>Determinarea si modificarea catalogului curent de lucru</titlu>
Pentru a determina catalogul curent de lucru, emiteti comanda:
pwd
<nota>
*Jocul de cuvinte continua... S-a format o expresie frecvent folosita in
engleza americana, si anume been there, done that, cu sensul am fost acolo,
am facut aia - N.T.
**Un alt joc de cuvinte. In limba engleza, forma contrasa a prenumelui
autorului - in speta Bill- si traducerea termenului nota de plata - adica
bill- se scriu si se pronunta absolut la fel.-N.T.</nota>
Pentru a inlocui catalogul curent de lucru, emiteti comanda:
cd cale
unde cale este o cale absoluta sau relativa, care precizeaza catalogul scontat.
<sugestie>
Majoritatea sistemelor UNIX incorporeaza calea asociata catalogului curent
de lucru, sau cel putin o parte a acesteia, ca parte a promptului de comanda.
Daca sistemul dumneavoastra nu procedeaza astfel, solicitati-l pe administratorul
sistemului pentru a va ajuta sa-l configurati astfel incat sa prezinte
aceasta caracteristica. Astfel, va va fi mai simplu sa cunoasteti in permanenta
identitatea catalogului curent de lucru.</sugestie>
<titlu>Vizualizarea continutului catalogului</titlu>
Pentru a vizualiza numele fisierelor si ale cataloagelor stocate in catalogul
curent de lucru, emiteti comanda
ls
Sau, daca doriti sa vizualizati numele fisierelor si ale cataloagelor incluse
intr-un alt catalog, emiteti comanda
ls cale
unde cale este o cale absoluta sau relativa care precizeaza catalogul.
Pentru a vizualiza, alaturi de numele fisierelor si ale cataloagelor, si caracteristicile
acestora, adaugati indicatorul -l la comanda ls:
ls -l
sau
ls -;l cale
In mod prestabilit, comanda ls nu afiseaza cataloagele sau fisierele al caror
nume incepe cu un punct; se spune ca asemenea fisiere si cataloage sunt
ascunse. Pentru a vizualiza fisierele si cataloagele ascunse si omoloagele lor
vizibile, adaugati indica¬torul -a la comanda ls:
ls -a
sau
ls -;al cale
<remarca>
Comanda ls si alte comenzi care manipuleaza cataloage vor esua daca utilizatorul
nu are privilegii adecvate pentru accesul la catalog. Vezi sub-sectiunea intitulata
„Privilegii de catalog".</remarca>
<titlu>Crearea unui catalog</titlu>
Pentru a crea un catalog, emiteti comanda mkdir: mkdir cale
unde cale este o cale absoluta sau relativa care precizeaza catalogul ce urmeaza
fi creat.
<titlu>Stergerea unui catalog</titlu>
Pentru a sterge un catalog, emiteti comanda rmdir:
rmdir cale
unde cale este o cale absoluta sau relativa, care precizeaza catalogul ce urmeaza
a fi sters. Catalogul trebuie sa fie vid; in caz contrar, comanda va esua.
<titlu>Privilegii de catalog</titlu>
Ca si fisierele, cataloagele au privilegii asociate. Privilegiile unui catalog
se noteaza folosind aceleasi litere care indica privilegiile fisierelor; cu
toate acestea, literele au semnificatii oarecum diferite atunci cand se
aplica asupra cataloagelor:
• r, catalogul poate fi citit; cu alte cuvinte, sub-cataloagele si fisierele
pe care le contine pot fi afisate prin intermediul comenzii ls si a altor mijloace
similare
• w, catalogul poate fi scris; cu alte cuvinte, sub-cataloagele si fisierele
pe care le contine pot fi create in catalog si apoi sterse de acolo
• x, catalogul se poate folosi; cu alte cuvinte, sub-cataloagele si fisierele
pe care le contine sunt accesibile
<Sfatul specialistului>
Intrebare: Stergerea unui catalog care contine mai multe sub-cataloage
si fisiere este o operatie greoaie. Exista vreo moda¬litate mai simpla?
Raspuns: Pentru a sterge un catalog si intreg continutul sau, emiteti
comanda rm -rf cale unde cale este o cale absoluta sau relativa, care precizeaza catalogul ce urmeaza
a fi sters. Procedati cu mare atentie atunci cand folositi aceasta comanda,
deoarece in general, cataloagele si fisierele sterse nu pot fi recuperate.
</Sfatul specialistului>
Cand este executata cu argumentul -l, comanda ls indica privilegiile
asociate , unui catalog. Utilizatorii cu privilegii adecvate pot modifica privilegiile
asociate unui catalog. Pentru aceasta, folositi comanda chmod, care a fost descrisa
anterior in acest modul.
<Test „la minut">
• Care este comanda UNIX ce se poate folosi pentru a vizualiza conti¬nutul
unui fisier?
• Care este comanda UNIX ce se poate folosi pentru stergerea unui fisier?
• Care sunt operatiile permise posesorului unui fisier de catre setul
de privilegii r-xr-----?
• Care este comanda UNIX care precizeaza catalogul curent de lucru?
</Test „la minut">
<titlu>Lucrul cu fisiere</titlu>
Aceasta sectiune se bazeaza pe notiunile fundamentale insusite in
sectiunea anterioara, prezentand modul de lucru cu fisiere prin utilizarea
limbajului PHP. Deoarece modelul sistemului de fisiere folosit in Microsoft
Windows difera de modelul sistemului de fisiere folosit in UNIX, unele
functii PHP nu functioneaza corect sub Windows. De asemenea, pentru a complica
si mai mult lucrurile, versiunea PHP 4.02 a introdus unele modificari in
ceea ce priveste modul de lucru al limbajului PHP cu fisierele si cataloagele.
Deci, sectiunea de fata trateaza PHP versiunea 4.02 si versiunile ulterioare
sub UNIX. Expunerea indica incompatibilitatile majore, dar trebuie sa stiti
ca, daca folositi Windows sau o versiune ante¬rioara a limbajului PHP, veti
descoperi ca unele exemple nu functioneaza asa cum ar trebui.
<titlu>Aspecte legate de proprietate si privilegii</titlu>
Desi numerosi programatori PHP folosesc fisiere pentru stocarea datelor, trebuie
sa va ganditi bine inainte de a lua aceasta decizie. Stocarea datelor
in fisiere poate duce la afectarea caracterului privat al informatiilor
pe care le contin, respectiv la alterarea sau chiar distrugerea fisierelor.
Sa ne reamintim ca privilegiile asociate unui fisier sau unui catalog determina
operatiile pe care le poate executa un utilizator cu fisierul sau catalogul
respectiv. Cand PHP ruleaza, o face sub un cont de utilizator desemnat.
Privilegiile asociate fisierului sau catalogului determina operatiile pe care
PHP le poate executa.
Un administrator de sistem poate configura contul de utilizator sub care ruleaza
PHP. Deseori, administratorii de sistem configureaza PHP astfel incat
sa ruleze sub un cont special de utilizator, care are privilegii foarte limitate;
frecvent, acest cont se numeste nobody (in traducere nimeni). Rularea
PHP sub un cont cu privilegii limitate
<nota>
Raspunsuri la test:
• more
• rm
• read, execute
• pwd
</nota>
ii ajuta pe administratori sa protejeze PHP impotriva pericolelor
la adresa securitati si este considerat un obicei bun.
Cu toate acestea, daca administratorul dumneavoastra de sistem a configurat
PHP astfel incat sa ruleze sub un cont precum nobody, a pune fisierele
dumneavoastra la dispozitia PHP devine o problema. O modalitate consta in
a permite tuturor utilizatorilor sa aiba acces la fisiere. Daca doriti ca PHP
sa poata citi fisie¬rele, aceasta metoda este acceptabila. Dar, daca fisierele
contin informatii confidentiale sau daca doriti ca PHP sa poata scrie in
fisiere, metoda nu este recomandata. Utilizarea acesteia poate duce la un acces
neautorizat la informatiile confidentiale incluse in fisiere, respectiv
la alterarea sau chiar la distrugerea fisierelor.
O alta metoda consta in a solicita administratorului dumneavoastra de
sistem sa modifice proprietatea asupra fisierelor la care doriti ca PHP sa aiba
acces. De exemplu, administratorul de sistem poate repartiza fisierele grupului
nobody. Dum¬neavoastra, ca proprietar al fisierelor, puteti beneficia de
privilegii complete, iar PHP poate avea privilegiile disponibile pentru membrii
grupului. Totusi, aceasta metoda permite oricarui utilizator sa scrie un script
PHP si sa obtina acces la fisier cu aceleasi privilegii ca si cele permise PHP.
In general, si aceasta metoda se va dovedi nesatisfacatoare.
Cu exceptia cazurilor cand sunteti administrator de sistem si cand
nici un utilizator neautorizat nu poate obtine acces la sistem, probabil ca
nu veti reusi sa concepeti o metoda care sa va permita sa folositi fisiere pentru
a stoca intr-o maniera sigura date confidentiale sau volatile fara a risca
o compromitere a fisierelor sau chiar a sistemului insusi. O modalitate
mai sigura de stocare a datelor confidentiale sau volatile consta in utilizarea
unei baze de date. In general, fisierele constituie un mijloc adecvat
numai pentru stocarea datelor publice, non-volatile, care vor fi accesibile
sistemului PHP.
<titlu>Obtinerea atributelor unui fisier</titlu>
PHP furnizeaza numeroase functii care va permit sa obtineti informatii care descriu un fisier. Tabelul 11-2 rezuma cele mai cunoscute dintre aceste functii.
Functiile fileowner() si filegroup() returneaza fiecare un identificator numeric;
puteti converti identificatorul numeric intr-un sir prin invocarea functiei
posix_getpwuid() cu un identificator de utilizator, respectiv a functiei posix_getgrgid()
cu un identificat de grup.
<tabel 11-1 Functii PHP pentru obtinerea atributelor unui fisier>
*Descriere
*Functie
*file_exists()
*Returneaza true daca fisierul specificat exista, respectiv false in caz
contrar
*fileatime()
*Returneaza timpul de acces la fisier sub forma de amprenta de timp UNIX.
*filectime()
*Returneaza timpul de modificare al i-nodului (structura de date care contine informatii despre fisiere UNIX - N. T.) sub forma de amprenta de timp UNIX.
*filegroup()
*Returneaza identificatorul numeric al grupului care detine fisierul,
*filemtime()
*Returneaza momentul de timp al modificarii fisierului sub forma de amprenta
de timp UNIX.
*fileowner()
*Returneaza identificatorul numeric de utilizator al fisierului.
*fileperms()
*Returneaza permisiunile fisierului,
*filesize()
*Returneaza dimensiunea fisierului, in octeti.
*filetype()
*Returneaza tipul fisierului, in speta "fifo", "char",
"dir", "block", "link",
"file" sau "unknown".
*is_dir()
*Returneaza true daca fisierul specificat exista si este un catalog; in
caz contrar, returneaza false.
*is_file()
*Returneaza true daca fisierul specificat exista si este un fisier obisnuit;
in caz contrar, returneaza false.
*is_readable()
*Returneaza true daca fisierul specificat exista si poate fi citit; in
caz contrar, returneaza false.
*is_writable()
*Returneaza true daca fisierul specificat exista si se poate scrie in
acel fisier; in caz contrar, returneaza false.
</tabel 11-2>
Un exemplu care indica modul de invocare a acestor functii este rezident in
situl Web al cartii (https://www.osborne.com), astfel incat sa puteti
descarca si rula personal fisierul. Numele fisierului este attributes.php. Iata
continutul fisierului:
<?php
$filename = „ test.txt”;
$result = file_exists($filename) echo „<BR>file_exists(): $result”;
$result = posix_getpwuid(fileowner ($filename));
$result = $resulta“name”i; echo “<BR>fileowner(): $result”;
$result = posix_getgrgid(filegroup ($filename));
$result = $resulta“name”i; echo “<BR>filegroup(): $result”;
$result = filetype($filename); echo „<BR>filetype(): $result”;
$result = filesize($filename); echo „<BR>filesize(): $result”;
$result = fileatime($filename);
$result = date(„m/d/Y H:i”,$result); echo “<BR>fileatime(): $result”;
$result = filectime($filename);
$result = date(„m/d/Y H:i”,$result); echo “<BR>filectime(): $result”;
$result = filemtime($filename);
$result = date(„m/d/Y H:i”,$result); echo “<BR>filemtime(): $result”;
$result = fileperms($filename);
$result = decoct($result); echo “<BR>fileperms(): $result”;
$result = is_file($filename); echo „<BR>is_file(): $result”;
$result = is_dir($filename); echo „<BR>is_dir(): $result”;
$result = is_readable($filename); echo „<BR>is_readable(): $result”;
$result = is_writable($filename); echo „<BR>is_writable(): $result”;
?>
Daca rulati personal exemplul prezentat anterior, nu uitati sa modificati valoarea
variabilei $filename(nume fisier), folosind numele unui fisier rezident in
acelasi catalog ca si scriptul. Datele de iesire ale exemplului sunt asemanatoare
celor prezentate in listingul urmator:
file_exists(): 1 fileowner(): nobody filegroup(): nobody filetype(): file filesize(): 0 fileatime() : 04/12/2005 10:04 filectime() : 04/12/2005 11:28 filemtime() : 04/12/2005 10:36 fileperms(): 100644 is_file(): 1 is_dir(): 0 is_readable(): 1 is_writable(): 0
<titlu>Modificarea privilegiilor unui fisier</titlu>
Pentru a modifica privilegiile unui fisier, invocati chmod(), o functie ale
carei argumente sunt asemanatoare celor folosite in linia de comanda UNIX:
chmod(nume_fisier, mod)
Argumentul nume_fisier specifica numele sau calea de acces a fisierului ale
carui privilegii urmeaza a fi modificate, iar argumentul mod specifica privilegiile
dorite, in general, se prefera exprimarea privilegiilor sub forma unui
numar scris in octal. Pentru aceasta, prefixati valoarea folosind cifra
0. De exemplu, valoarea literala 010 are valoarea 8, nu valoarea 10. Ca atare,
puteti atribui unui fisier privilegiile rw- r- - - - - specificand valoarea
0640.
Pentru ca functia chmod() sa se execute cu succes, PHP trebuie sa ruleze sub
contul utilizatorului posesor al fisierului. Functia returneaza true in
caz de reusita, respectiv false in caz contrar.
<Atentie>
Functia chmod() nu functioneaza sub Microsoft Windows. </Atentie>
<titlu>Modificarea proprietatii asupra unui fisier</titlu>
Pentru a modifica grupul posesor al unui fisier, invocari functia chgrp(), care
are forma:
chgrp(nume_fisier, grup)
unde nume_fisier este numele sau calea fisierului, iar grup este numele sau
identifica¬torul numeric al grupului. Pentru ca functia sa se execute cu
succes, contul de utilizator sub care ruleaza PHP trebuie sa fie posesor al
fisierului si sa fie membru al grupului specificat prin argumentul grup. Functia
returneaza true in caz de reusita, respectiv false in caz contrar.
<Atentie>
Functia chgrp() nu functioneaza sub Microsoft Windows. </Atentie>
<remarca>
Desi PHP include o functie chown() care modifica proprietatea asupra unui fisier,
PHP trebuie sa ruleze folosind contul radacina pentru ca aceasta functie sa
poata da rezultate. Deoarece acesta este un procedeu nesigur si rareori folosit,
in general functia chown() nu este disponibila. </remarca>
<titlu>Deschiderea unui fisier</titlu>
Procesul de stabilire a accesului la un fisier se numeste deschiderea fisierului,
inainte de a putea citi sau scrie intr-un fisier, trebuie sa deschideti
fisierul folosind functia fopen():
fopen(nume_fisier, mod)
unde nume_fisier specifica numele sau calea spre fisierul care urmeaza a fi
deschis, iar mod indica tipul de acces dorit. De exemplu, instructiunea urmatoare
deschide fisierul o_carte.txt pentru citire:
$fh = fopen(„o_carte.txt”, „r”);
Observati ca functia fopen () returneaza o valoare. Aceasta valoare este false
daca PHP nu a reusit sa deschida fisierul, in caz contrar, aceasta valoare
contine un
intreg care se numeste identificator de fisier, care se foloseste pentru
identificarea unui fisier de catre functiile care executa operatii cu fisiere.
Uneori, aceasta valoare se numeste pointer de fisier. Cu toate acestea, termenul
identificator de fisier este mai exact, deoarece notiunea de identificator face
referire in mod corespunzator la o valoare intreaga, in timp
ce termenul de pointer face referire la o adresa din memorie.
Tabelul 11-3 prezinta valorile argumentului mod care pot fi transmise functiei
fopen(). Literele care desemneaza modurile corespund cuvintelor read (a citi),
write (a scrie) si append (a atasa). Un mod ("r") permite accesul
la citire. Doua moduri permit accesul la scriere (acestea sunt "w"
si "a"). Trei moduri (cele care includ un semn +) permit ambele tipuri
de acces. Unele moduri determina PHP sa incerce a crea fisierul, daca
acesta nu exista. Doua moduri trunchiaza un fisier existent, adica sterg continutul
fisierului, nu si fisierul in sine.
<Atentie>
Pentru ca functia fopen() sa se execute cu succes, PHP trebuie sa ruleze sub
contul unui utilizator care dispune de suficiente privilegii pentru a executa
operatiile indicate de modul respectiv. De exemplu, pentru a putea crea un fisier,
PHP trebuie sa ruleze ca utilizator cu acces de scriere la catalogul in
care urmeaza a fi creat fisierul. </Atentie>
Fiecare fisier are un pointer asociat, care indica amplasarea octetului din
fisier unde se va produce urmatoarea operatie (citire sau scriere). Valoarea
modului functiei fopen() determina valoarea initiala a pointerului de fisier.
Sectiunea urma¬toare, „Navigarea intr-un fisier", explica
modul de acces la pointerul de fisier si modul de manipulare a acestuia.
PHP furnizeaza o forma alternativa a functiei fopen(), care preia trei argumente:
fopen(nume_fisier, mod, cale)
<tabel 11-3 Moduri folosite cu functia fopen()>
*Mod
*Citire
*Scriere
*Creare
*Trunchiere
*Pointer
*"r"
*x
*
*
*
*inceput
*"r+"
*x
*x
*
*
*inceput
*"w"
*
*x
*x
*x
*inceput
*"w+"
*x
*x
*x
*x
*inceput
*"a"
*
*x
*x
*
*Sfarsit
*"a+"
*x
*x
*x
*
*Sfarsit
Daca argumentul cale are valoarea "1", PHP va cauta fisierul intr-un
catalog special, denumit cale de includere. Administratorul PHP configureaza
identitatea caii de includere. Daca specificati argumentul cale, argumentul
nume_fisier trebuie sa fie alcatuit dintr-un nume de fisier sau o cale relativa,
nu dintr-o cale absoluta.
<Atentie>
In mod prestabilit, PHP 4.04pl1 raporteaza ca este configurata calea de
includere. Cu toate acestea, este necesara stabilirea manuala a valorii variabilei
include_path din fisierul php.ini; in caz contrar, calea de includere
nu va fi folosita. </Atentie>
<Atentie>
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate in
mod diferit. Cand deschideti un fisier binar sub Windows, specificati
b ca al doilea caracter al modului; de exemplu, "rb". Daca nu procedati
astfel, citirile din fisier si alte operatii se vor incheia prematur sau
vor esua. </Atentie>
<titlu>Verificarea finalizarii unei operatii cu un fisier</titlu>
Operatiile cu fisiere - inclusiv cele legate de deschiderea, citirea unui fisier
si scrierea intr-un fisier - pot esua dintr-o varietate de motive. Deci,
este important sa verificati daca fiecare operatie s-a incheiat cu succes.
Iata o modalitate in care puteti proceda:
$fh = fopen(„o_carte.txt”, „r”); if (!$fh)
A die(“Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
Functia fopen() returneaza false daca nu reuseste sa deschida fisierul. In
acest caz, scriptul invoca functia die () pentru a afisa un mesaj si pentru
a-si incheia executia.
Cu mult mai compacte, dar si posibil mai derutante, sunt formele folosite de
programatorii PHP cu experienta. De exemplu:
($fh = fopen(„o_carte.txt”, „r”))
|| die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
Parantezele si utilizarea caracterelor spatiu alb contribuie la clarificarea
acestei instructiuni. Instructiunea invoca functia fopen() si atribuie rezultatul
variabilei $fh. Apoi, executa o operatie SAU logic (simbolizata prin operatorul
11) cu doi operanzi, in speta $fh si die(). Daca variabila $fh are valoarea
true, rezultatul operatiei SAU logic va fi intotdeauna true; deci, in
acest caz, PHP nu executa evaluarea celuilalt operand al operatiei SAU logic,
adica invocarea functiei die(). Ca atare functia die() este executata numai
daca variabila $fh are valoarea false, adica daca functia fopen () esueaza.
O forma alternativa mai simpla foloseste operatorul OR (SAU):
($fh = fopen(„o_carte.txt”, „r”))
OR die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
Aceasta forma are acelasi principiu de functionare ca si forma anterioara.
Totusi, operatorul SAU are o precedenta mai redusa decat operatorul 11,
deci este posibila scrierea instructiunii cu un numar mai redus de paranteze.
<Sugestie>
Sa ne reamintim ca prin prefixarea, cu ajutorul caracterului @, a numelui unei
functii invocate, limbajul PHP elimina avertismentele si alte mesaje generate
in timpul executiei functiei. Daca testati cu sarguinta rezultatul
fiecarei operatii cu fisiere, puteti elimina cu usurinta mesajele de eroare
si implicit evitati amestecarea datelor de iesire ale scriptului dumneavoastra
cu mesajele PHP, care in caz contrar pot deruta utilizatorul.</sugestie>
<titlu>Inchiderea unui fisier</titlu>
Un fisier deschis consuma resursele sistemului. Cand un script a terminat
de utilizat un fisier, scriptul trebuie sa inchida fisierul, eliberand
aceste resurse. La sfarsitul unui script, PHP inchide in mod
automat fisierele deschise. Totusi, la programare se recomanda sa inchideti
fisierele mai rapid, ori de cate ori este posibil.
Pentru a inchide un fisier, invocati functia fclose():
fclose(identificator_fisier)
unde identificator_fisier este identificatorul fisierului, returnat la deschiderea
acestuia. De exemplu, iata un exemplu caracteristic de deschidere, utilizare
si inchidere a unui fisier:
$fh =@fopen(„o_carte.txt”, „r”); if (!$fh)
A die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
// Aici se insereaza instructiunile care folosesc fisierul deschis @fclose($fh);
<Sugestie>
Functia fclose() returneaza valoarea true daca fisierul a fost inchis
cu succes. Testarea acestei valori este rareori necesara, deoarece nu se mai
pot face prea multe dupa ce s-a ratat o incercare de a inchide un
fisier. </Sugestie>
<titlu>Citirea dintr-un fisier</titlu>
PHP furnizeaza o varietate de functii pentru citirea fisierelor. Prima dintre
acestea este fread(), care are urmatoarea forma:
fread(identificator_fisier, lungime)
Argumentul identificator_fisier este valoarea returnata de functia fopen(),
iar argumentul lungime specifica numarul maxim de octeti care vor fi cititi.
Octetii cititi
din fisier sunt returnati sub forma de valoare de tip sir. Daca operatia de
citire intalneste sfarsitul fisierului, PHP va returna mai
putin de lungime octeti.
<Sugestie>
PHP include o functie conexa, denumita fgetc(), care citeste un octet din fisierul
specificat. </Sugestie>
Iata un exemplu care prezinta modul de citire si de afisare a unui text dintr-un
fisier:
$fh =@fopen(„o_carte.txt”, „r”); if (!$fh)
A die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
$s = fread($fh, 256); echo „<BR>Citeste: $s”; fclose($fh);
Exemplul citeste maximum 256 de octeti din fisier. Pentru a citi un numar mai
mare sau mai mic de octeti, modificati valoarea argumentului lungime al functiei
fread().
<Sugestie>
Daca doriti sa incercati personal acest exemplu, asigurati-va ca fisierul
o_carte.txt se afla in acelasi catalog ca si scriptul dumneavoastra si
ca PHP are permisiunea de a citi fisierul.</sugestie>
Pentru a citi si a afisa intregul continut al fisierului, folositi functia
filesize() pentru a furniza valoarea argumentului lungime, astfel:
$nume_fisier = „o_carte.txt”;
$fh =@fopen($nume_fisier, „r”); if (!$fh)
A die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
$s = fread($fh, filesize($nume_fisier, „r”)); echo „<BR>Citeste: $s”; fclose($fh);
<titlu>Citirea unei linii de text</titlu>
O linie de text este o serie de caractere urmate de un caracter de terminare
a liniei. Se obisnuieste frecvent citirea linie cu linie a unui text dintr-un
fisier. Functia fgets() citeste o linie dintr-un fisier; functia are urmatoarea
forma:
fgets(identificator_fisier, lungime)
Ca si in cazul functiei fread(), argumentul identificator_fisier este
o valoare returnata de functia fopen(); cu toate acestea, argumentul lungime
specifica numarul
maxim de octeti care vor fi cititi, minus o unitate, pentru a permite includerea
caracte¬rului de terminare a liniei. Octetii cititi din fisier sunt returnati
ca valoare de tip sir.
Iata un exemplu care prezinta modul de citire si de afisare a primei linii a
unui fisier:
$fh =@fopen(„o_carte.txt”, „r”); if (!$fh)
A die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
$s = fgets($fh, 256); echo „<BR>Citeste: $s”; fclose($fh);
In exemplul anterior s-a presupus ca linia cea mai lunga a fisierului
contine mai putin de 256 octeti. Pentru a permite lungimi de linie mai mari,
pur si simplu modificati valoarea argumentului lungime al functiei fgets ().
<titlu>Citirea linie cu linie a unui intreg fisier</titlu>
In general, dintr-un fisier trebuie citit mai mult decat prima linie
a acestuia. Pentru aceasta, un script trebuie sa dispuna de o modalitate de
a determina momen¬tul cand fisierul a fost citit in totalitate.
Functia feof() are chiar acest scop, returnand o valoare care arata daca
s-a ajuns sau nu la sfarsitul fisierului. Functia are urmatoarea forma:
feof(identificator_fisier)
Argumentul identificator_fisier este valoarea returnata de functia fopen().
Functia feof() returneaza true daca fisierul specificat este la sfarsit;
in caz contrar, returneaza false.
Iata cum se poate folosi functia feof() pentru a controla procesul de citire
a unui intreg fisier, linie cu linie:
$fh =@fopen(„o_carte.txt”, „r”); if (!$fh)
A die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
$s = fgets($fh, 256);
while (!feof($fh))
A echo „<BR>Citeste: $s”;
$s = fgets($fh, 256);
S fclose($fh);
Instructiunea while asigura faptul ca functia fgets() este apelata in
mod repetat, pana la citirea tuturor liniilor.
O modalitate mai simpla de a citi linie cu linie un intreg fisier consta
in a folosi functia file(). Aceasta functie returneaza un tablou in
care fiecare element contine
o linie a fisierului text specificat. Iata un exemplu care foloseste functia
file() pentru a citi si pentru a afisa continutul unui fisier:
$tablou = file(„o_carte.txt); forech ($tablou as $s);
A echo „<BR>Citeste: $s”;
S
<atentie>
Aceasta metoda nu este adecvata pentru fisiere de foarte mari dimensiuni, deoarece
in tablou este incarcat intregul continut al fisierului, ceea
ce poate necesita o cantitate de memorie superioara celei disponibile. </atentie>
<titlu>Afisarea continutului unui fisier</titlu>
PHP furnizeaza doua functii care faciliteaza afisarea continutului unui fisier.
Una dintre functii, fpassthru(), necesita un argument care specifica identificatorul
fisierului care urmeaza sa fie afisat:
$fh = fopen(„o_carte.txt”, „r”); fpassthru($fh);
Dupa ce a afisat fisierul, functia il inchide automat.
Cealalta functie, readfile(), necesita numai numele sau calea fisierului:
readfile(„o_carte.txt”=;
<titlu>Navigarea printr-un fisier</titlu>
Asa cum s-a aratat anterior, fiecare fisier are un pointer asociat care indica
pozitia octetului unde se va produce urmatoarea operatie. Puteti folosi functia
rewind() pentru a readuce pointerul la inceputul fisierului. Functia are
urmatoarea forma:
rewind(identificator_fisier)
unde identificator_fisier este identificatorul de fisier returnat de functia
fopen().
<remarca>
Nu puteti readuce pointerul unui fisier la inceputul propriu-zis al unui
fisier daca fisierul a fost deschis pentru un acces de tip atasare, adica intr-unul
din modurile 'a' sau 'a+'.</remarca>
Iata un exemplu care prezinta modul de utilizare a functiei rewind() pentru
a afisa de doua ori continutul unui fisier:
$fh =@fopen(„o_carte.txt”, „r”); if (!$fh)
A die („Nu a fost deschis fisierul <I>o_carte.txt</I>.”);
S
$s = fgets($fh, 256);
while (!feof($fh))
A echo „<BR>\$s: $s”;
$s = fgets($fh, 256);
S
// Deruleaza la inceputul fisierului si reia redarea acestuia rewind($fh);
while (!feof($fh))
A echo „<BR>\$s: $s”;
$s = fgets($fh, 256);
S fclose($fh);
Daca se produce vreo eroare, functia rewind() returneaza zero.
Desi functia rewind() este utila in caz de nevoie, necesitatea de a readuce
un pointer de fisier la inceputul fisierului nu este chiar atat
de frecventa. Functia fseek() furnizeaza o mai mare flexibilitate, permitandu-va
sa pozitionari pointerul de fisier astfel incat sa puteti citi sau
scrie in orice punct al fisierului. Functia are doua forme, cea mai simpla
fiind urmatoarea:
fseek(identificator_fisier, offset)
unde identificator_fisier este identificatorul de fisier returnat de functia
fopen(), iar offset este pozitia dorita a pointerului de fisier, specificata
in octeti, in raport cu inceputul fisierului, in caz
de reusita, functia fseek() returneaza 0; in caz contrar, returneaza -l
.
O forma alternativa a functiei asigura un grad superior de flexibilitate:
fseek(identificator_fisier, offset, baza)
unde identificator_fisier si offset au semnificatiile definite anterior, iar
baza ia una ; dintre urmatoarele valori:
• SEEK_SET, care stabileste pozitia pointerului de fisier in raport
cu inceputul fisierului
• SEEK_CUR, care stabileste pozitia pointerului de fisier in raport
cu valoarea curenta a pointerului
• SEEK_END, care stabileste pozitia pointerului de fisier relativ la sfarsitul
fisierului
Valoarea argumentului offset poate fi pozitiva, negativa sau zero.
De exemplu, pentru a pozitiona pointerul cu 1000 de octeti inainte de
sfarsitul fisierului, emiteti urmatorul apel de functie:
fseek($fh, -1000,SEEK_END)
unde $fh este identificatorul fisierului al carui pointer doriti sa-1 repozitionati.
Pentru a obtine valoarea curenta a pointerului de fisier, invocau functia ftell(),
care are urmatoarea forma:
ftell(identificator_fisier)
Functia returneaza valoarea curenta a identificatorului de fisier, respectiv
valoarea zero daca functia esueaza.
<titlu>Scrierea intr-un fisier</titlu>
Spre deosebire de varietatea de functii furnizate pentru citirea fisierelor,
PHP ofera o singura functie pentru scrierea in fisiere, si anume fwrite().
Functia are urmatoarea forma:
fwrite(identificator_fisier, data)
unde identificator_fisier este identificatorul de fisier returnat de functia
fopen(), iar data este o valoare sir care determina datele care urmeaza a fi
scrise. Daca executia functiei reuseste, returneaza numarul octetilor scrisi;
in caz contrar, retur¬neaza valoarea —l.
Iata un exemplu care prezinta modul de scriere a datelor intr-un fisier:
$fh =@fopen(„jurnal.txt”, „a”); if (!$fh)
A die („Nu a fost deschis fisierul <I>jurnal.txt</I>.”);
S
$ok = fwrite($fh, „Acestea sunt date bune.\n”); echo „<BR>Rezultatul scrierii: $ok”; fclose($fh);
Programul prezentat in exemplul anterior scrie in fisier o linie
de text. Deoarece fisierul a fost deschis folosind modul "a", datele
sunt atasate la fisier; cu alte cuvinte, datele sunt scrise dupa toate datele
existente in fisier. Observati ca a fost scris si un caracter de terminare
a liniei ("\n"), astfel incat fisierul sa poata fi citit
linie cu linie la un moment de timp ulterior. Daca lucrati cu un fisier text,
in general trebuie sa includeti un caracter de terminare a liniei la sfarsitul
fiecarei linii scrise in fisier.
Programul din exemplu scrie in fisier o singura linie de text. Totusi,
puteti scrie mai multe linii, daca doriti. Daca apelati functia fwrite() din
interiorul unei bucle, aveti posibilitatea de a scrie mai multe linii. Dupa
ce ati scris toate liniile de care aveti nevoie, inchideti fisierul prin
apelarea functiei fclose().
PHP mai furnizeaza si o forma alternativa a functiei fwrite():
fwrite(identificator_fisier, data, lungime)
Aceasta forma include un al treilea argument, si anume lungime, care va permite
sa specificati numarul maxim de octeti care vor fi scrisi.
<Sugestie>
Argumentul lungime al functiei fwrite() trebuie utilizat atunci cand se
scrie in fisiere binare sub Microsoft Windows. De asemenea, Windows prefera
secventa de terminare a liniei "\r\n". Atunci cand scrieti programe
PHP pentru sisteme Windows, este de preferat sa folositi secventa Windows de
terminare a liniei.
</sugestie>
<sugestie>
PHP dispune de o alta functie pentru scrierea fisierelor, in speta fputs().
Totusi, in afara de nume, fputs() este una si aceeasi functie cu fwrite().
Deci, practic, fputs() si fwrite() reprezinta una si aceeasi functie, cu nume
diferite.
</sugestie>
<titlu>Proiect 11-1: Un contor pentru numarul de deschideri ale unei
pagini</titlu>
In cadrul acestui proiect, veti construi un script care numara de cate
ori s-a obtinut accesul la o anumita pagina Web.
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de citire si scriere a unui fisier folosind PHP
• Prezentarea modului de creare a unui contor utilizat intr-o pagina
Web
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit ctr.php si incarcati
acest fisier in serverul dumneavoastra PHP:
<?php
$cfile = basename($PHP_SELF) . ".dat";
$fh = fopen($cfile, "r+"); if (!$fh)
A die("<BR>Nu a fost deschis fisierul <I>$cfile</I>.");
S
$s = fgets($fh, 6);
$count = (int) $s;
$count = $count + 1;
$count = str_pad($count, 6); rewind($fh); fwrite($fh, $count); echo "$count"; fclose($fh);
?>
2. Plasati urmatorul script PHP intr-un fisier numit ctr-test.php si
incarcati acest fisier in serverul dumneavoastra, inserandu-l
in acelasi catalog ca si fisierul ctr.php:
<HTML>
<HEAD>
<TITLE>ctr-test.php</TITLE>
</HEAD>
<BODY>
Aceasta pagina a fost deschisa de <B>
<?php include "ctr.php" ?>
</B> ori.
</BODY>
</HTML>
3. Creati fisierul ctr-test.php.dat in acelasi catalog care contine scripturile
pe care le-ati incarcat. Puteti crea fisierul prin emiterea comenzii
touch ctr-test.php.dat
Asigurati-va ca PHP are acces de citire si de scriere la fisier. Daca nu stiti
precis cum trebuie sa efectuati aceasta operatie, luati legatura cu administratorul
dumneavoastra de sistem.
4. Alocati un timp studiului scriptului PHP ctr.php. Observati modul in
care scriptul folo¬seste variabila PHP $PHP_SELF pentru a determina numele
fisierului care o contine si apoi ataseaza particula .dat pentru a forma numele
fisierului care contine contorul de pagina. De asemenea, remarcati functiile
pe care le foloseste scriptul pentru a executa operatiile cu fisiere.
5. Alocati un timp studiului scriptului PHP ctr-test.php. Remarcati ca acest
script este alcatuit mai ales din coduri HTML; in fisier apare o singura
linie PHP. Instructiunea include determina limbajul PHP sa includa continutul
fisierului ctr.php in fisierul ctr-test.php atunci cand este deschis
acesta din urma.
6. Orientati un browser Web spre adresa URL a scriptului ctr-test.php. Browserul
trebuie sa afiseze numarul de deschideri ale paginii. Prin reimprospatarea
paginii se determina incrementarea contorului din pagina.
<titlu>Obtinerea accesului exclusiv la un fisier</titlu>
Web-ul ridica o problema speciala pentru dezvoltatorii de programe, deoarece
mai multi utilizatori pot avea acces simultan la un singur script PHP. Uneori,
accesul simultan poate avea ca rezultat deteriorarea fisierului. Pentru a vedea
cum se poate produce aceasta, sa luam in considerare procesul de acces
si actualizare a contorului de pagini asociat unei pagini Web. Sa presupunem
ca, initial, contorul paginii are valoarea 100. Acest proces implica urmatoarea
succesiune de evenimente:
1. Deschide fisierul care contine valoarea contorului.
2. Citeste fisierul, obtinand valoarea curenta a contorului (100).
3. Incrementeaza contorul (101).
4. Scrie in fisier, stocand valoarea actualizata a contorului (101).
5. Inchide fisierul.
Acum, sa vedem ce se poate intampla daca doua procese obtin acces
simultan la pagina Web si la contorul sau, astfel incat etapele
celor doua procese se intrepatrund. Tabelul 11-4 prezinta rezultatul.
<tabel 11-4 Acces conflictual la un fisier>
Procesul nr. 1
1. Deschide fisierul care contine valoarea contorului.
2. Citeste