- Invatati sa blocati si sa obtineti accesul exclusiv la un fisier
- Invatati sa copiati, sa redenumiti si sa stergeti un fisier
- Studiati un script PHP util pentru incarcarea de fisiere in server
1. Obtinerea accesului exclusiv la un fisier
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 date incorecte. Pentru a vedea cum se poate produce aceasta, sa luam în considerare urmatorul script, care reprezinta un contor pentru numarul de deschideri a unei pagini.
<?php
$contor = "ctr.txt";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul ctr.txt.";
}
else {
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
echo "<br /> Nr. vizitari: $count";
fclose($fh);
}
?>
Remarcati functiile pe care le foloseste scriptul pentru a executa operatiile cu fisiere. Programul deschide fisierul "ctr.txt" pentru citire si scriere, preia datele din acesta, care sunt un numar intreg, mareste acel numar cu o unitate, intoarce pointerul la inceputul fisierului "rewind" dupa care rescrie noul numar, afiseaza numarul si inchide fisierul.
Secventa de cod descrisa mai sus poate creea probleme in cazul in care, de exemplu doi utilizatori diferiti acceseaza acelasi fisier, in acelasi timp, cand contoarul este, de exemplu, la numarul 100. Amandoi vor incrementa numarul 100 cu o unitate si va rescrie in fisierul "ctr.txt" 101; in final, contoarul va arata 101, in loc de 102 cum ar fi trebuit (deoarece au fost 2 vizitatori).
Pentru a evita astfel de conflicte PHP pune la dispozitia utilizatorilor o metoda prin care se poate bloca accesul temporar la un fisier. Pe durata blocarii, un alt utilizator nu va mai putea scrie/citi din acest fisier. De aceea durata blocarii trebuie sa fie limitata.
Functia care realizeaza blocarea este
flock(), care are urmatoarea forma:
- flock(identificator_fisier, operatie)
- Unde "identificator_fisier" este identificatorul de fisier returnat de functia fopen(). Argumentul "operatie" este o constanta sau o expresie care poate avea urmatoarele valori:
- LOCK_SH - Blocare partajata in scopuri de citire
LOCK_EX - Blocare exclusiva in scopuri de scriere
LOCK_NB - Blocare fara fixare
LOCK_UN - Eliminarea blocarii
Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu, contoarul de mai sus, de data aceasta imbunatatit.
<?php
$contor = "ctr.txt";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul ctr.txt.";
}
else {
flock($fh, LOCK_EX);
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
flock($fh, LOCK_UN);
echo "<br /> Nr. vizitari: $count"
fclose($fh);
}
?>
- De data aceasta scriptul blocheaza fisierul "ctr.txt" pe timpul citirii si scrierii acestuia, astfel încât accesul simultan sa nu cauzeze o numarare eronata.
Blocare se face imediat dupa ce a fost deschis fisierul, cu "LOCK_EX", si se incheie imediat dupa rescrierea in fisier, prin deblocare acestuia "LOCK_UN".
2. Copierea unui fisier
O functie care faciliteaza copierea fisierelor, este copy(). Functia copy() are urmatoarea forma:
copy (sursa, destinatiea)
Unde "sursa" este numele si calea fisierului care urmeaza a fi copiat, iar "destinatie" este numele sau calea copiei.
Functia returneaza TRUE daca operatia de copiere reuseste; în caz contrar, returneaza FALSE.
Iata un exemplu în care este prezentat modul de utilizare a functiei copy():
<?php
$ok = copy("test.txt", "test.txt.bak");
if (!$ok) {
echo "Copierea nu a reusit.";
}
?>
Exemplul creeaza o copie a fisierului "test.txt", cu numele "test.txt.bak", in acelasi director.
Functia
copy() va suprascrie fisierul destinatie, daca acesta exista.
3. Modificarea numelui unui fisier
Functia care va permite sa modificati numele unui fisier este rename(), aceasta care are urmatoarea forma:
rename(nume_vechi, nume_nou)
Unde "nume_vechi" este numele si calea originala a fisierului, iar "nume_nou" este numele dorit.
Functia returneaza TRUE daca operatia de modificare a numelui a reusit; în caz contrar, returneaza FALSE.
Iata un exemplu de utilizare a functiei rename():
<?php
$ok = rename("test.txt", "teste.dat");
if (!$ok) {
echo "Modificarea numelui nu a reusit.";
}
?>
- Exemplu modifica numele fisierului "test.txt" in "teste.dat".
4. Stergerea unui fisier
Functia care va permite sa stergeti un fisier este unlink(), aceasta care are urmatoarea forma:
unlink(nume_fisier)
Unde "nume_fisier" este numele si calea fisierului care va fi sters.
Functia returneaza TRUE daca operatia de stergere a reusit; în caz contrar, returneaza FALSE.
Iata un exemplu de utilizare a functiei unlink():
<?php
$ok = unlink("test.txt");
if (!$ok) {
echo "Stergerea fisierului nu a reusit.";
}
?>
- Exemplu sterge fisierului "test.txt".
Retineti ca PHP trebuie sa aiba acces de scriere la catalogul în care se vor executa operatiile de copiere, redenumire sau stergere; în caz contrar, PHP nu va putea executa aceste operatii.
5. Incarcarea unui fisier in server
Pentru incarcarea unui fisier in server, se folosesc formulare HTML impreuna cu un script PHP de incarcare care foloseste functia move_uploaded_file() pentru operatia de upload.
Pentru a crea un formular de încarcare, specificati ENCTYPE="multipart/form-data" în eticheta FORM si includeti un control de introducere a datelor cu atributul TYPE="FILE".
Iata un exemplu de script PHP si formular HTML care incarca fisierele in server:
<?php
if(isset($_POST['submit'])) {
$uploadpath = "upload/"; // Modifica aici directorul de upload
$uploadpath = $uploadpath . basename( $_FILES['fisier']['name']);
if(move_uploaded_file($_FILES['fisier']['tmp_name'], $uploadpath)) {
echo"Fisier: ". basename( $_FILES['fisier']['name']). " a fost incarcat";
}
else {
echo "Eroare la urcarea fisierului pe server, mai incerca o data!";
}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
Alege fisierul:
<input type="file" name="fisier" /> <br />
<input type="submit" name='submit' value="Trimite" />
</form>
- Când utilizatorul apasa pe butonul de "Trimite", scriptul PHP preia datele si va incarca fisierul dorit in server
- O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina ->
Functii pentru fisiere si directoare.