Cum se creează un fișier temporar pe php, atunci când funcția tmpfile () nu se potrivește 1

Cum se creează un fișier temporar în PHP atunci când funcția tmpfile () nu este potrivită +12

- la fel ca Forbes, doar mai bine.

Când un programator PHP are nevoie să creeze un fișier temporar, el găsește o funcție tmpfile () în manual și după ce a studiat exemplele începe să se gândească cum să o aplice mai bine. Așa că a fost cu mine, când aveam nevoie să încarc datele chiar în fișierul temporar și să nu lucrez cu ele printr-o variabilă. Dar, cu un fișier creat în acest fel, nu este convenabil să lucrăm în viitor, deoarece tmpfile () returnează un mâner, nu o referință la un fișier local. Să mergem mai adânc în anatomia dosarului temporar și să privim capcanele cu care trebuia să trec.







Funcția tmpfile () creează o resursă, deoarece aceasta se face de către fopen (). și funcționează cu fluxurile I / O STDIO. Acest lucru este echivalent cu dacă am deschis fluxul temp php: // pentru a lucra cu fișierul temporar. În ambele cazuri, fișierul va apărea în dosarul temporar, care este înregistrat în php.ini. și va fi șters automat atunci când scriptul se termină sau în prealabil cu fclose ().


Când lucrați cu php: // fișierul temp va fi creat într-un director temporar atunci când dimensiunea datelor depășește 2 MB. Înainte de aceasta, toate datele înregistrate vor fi stocate în memoria php: //. Această restricție poate fi eludată dacă intrați imediat în fluxul php: // temp / maxmemory: 0. - PHP

Deoarece tmpfile () și fopen () lucrează cu fluxuri la crearea unui fișier temporar, putem folosi meta date cu stream_get_meta_data () pentru a afla calea reală spre fișier pentru o manipulare ulterioară:

Valorile returnate de stream_get_meta_data () sunt bine documentate în documentație. dar suntem mai interesați de numele de fișier asociat fluxului. Acesta poate fi extras prin cheia uri în matrice.

În cazul php: // temp, nu putem obține URI din metadate în nici un fel, deși fișierul va fi în fapt creat într-un dosar temporar dacă greutatea lui depășește 2 MB. Un alt mod de a afla unde este stocat fizic dosarul temporar și sub ce nume când lucrați cu fire nu există.







A arunca o resursă de la un obiect la altul, de asemenea, nu este foarte convenabilă, deoarece pentru această implementare veți avea nevoie de o interfață. În cazul meu, a trebuit să transfer numele fișierului temporar cu clasa Fișier din pachetul Symfony HttpFoundation unui obiect care avea o dependență strictă de clasa File din constructor. Logica de afaceri a aplicației a presupus validarea fișierului la un alt nivel și a fost important să se aibă grijă să se elimine fișierul la începutul căii sale dacă testul eșuează. În acest moment, a devenit clar că funcția tmpfile () nu este potrivită pentru crearea unui fișier temporar.

Pentru o soluție alternativă, am scris propriul meu mecanism, care funcționează după cum urmează: crearea unui fișier într-un director temporar> orice manipulare de fișiere> ștergere automată. Creați un fișier cu un nume unic în folderul temporar PHP permite utilizarea funcției tempnam ().

Primul argument specifică locația dosarului temporar prin sys_get_temp_dir (). iar al doilea este prefixul în numele fișierului. Un astfel de fișier este citit și scris doar proprietarului, deoarece este creat cu drepturile 0600 (rw-). Pentru a pune în aplicare ștergerea automată a fișierelor de transfer de oferta logica suplimentară în clasa, în cazul în care, cu ajutorul __destruct () încercați să ștergeți fișierul.

Obiectul va returna o referință la fișierul pe care a creat-o funcția tempnam (). deoarece în clasa __toString () este înregistrată. Așa că am scăpat de resursă. Fișierul în sine va fi îndepărtat în timpul eliberării toate referirile la obiectul sau finalizarea scenariului, dar inainte de caz, până când aceasta este cauzată de o eroare fatală sau excepție este aruncată.


Distrugătorul este chemat atunci când obiectul este distrus. În cazul erorilor critice, __destruct () nu poate fi apelat în PHP7 și mai jos. Distrugătorul nu trebuie să lase obiectul într-o stare instabilă. Prin urmare, în PHP, manipulatorii pentru distrugerea și eliberarea unui obiect sunt separați unul de celălalt. Operatorul de eliberare este chemat atunci când motorul este pe deplin încrezător că obiectul nu mai este folosit în altă parte. - Obiecte din PHP7

Ștergerea unui fișier printr-un destructor nu este cea mai bună practică, care, apropo, este utilizată în multe soluții accesibile. Pentru ștergerea garantată a fișierului, putem înregistra funcția noastră, care va fi executată în orice caz după terminarea scriptului. Acest lucru se face folosind register_shutdown_function () în constructorul clasei noastre:

Această abordare vă permite să creați un fișier temporar fără a utiliza tmpfile () sau php: // temp. că în OOP este foarte convenabil. Metodele standard sunt preferabile pentru rezolvarea problemelor locale, unde toată logica este încapsulată într-o singură metodă sau clasă.

Rezultatul a fost o clasă pentru lucrul cu un fișier temporar. Am postat codul sursă în depozit pe Gitshab denisyukphp / tmpfile și am adăugat suportul CRUD clasei. Metodele de scriere și de citire sunt wrappers pentru file_put_contents () și file_get_contents (). Vă puteți conecta la proiect prin Composer.







Trimiteți-le prietenilor: