Hogyan hozzunk létre ideiglenes fájlt a php-n, ha a tmpfile () függvény nem illik 1-re

Hogyan hozzunk létre egy ideiglenes fájlt PHP-ben, ha a tmpfile () függvény nem megfelelő +12

- ugyanaz, mint Forbes, csak jobb.

Ha egy PHP programozónak ideiglenes fájlt kell létrehoznia, a kézikönyvben egy tmpfile () függvényt talál, és a példák tanulmányozása után elkezd gondolkodni, hogyan kell jobban alkalmazni. Tehát velem volt, amikor fel kellett töltenem az adatokat az ideiglenes fájlba, és nem dolgoztam velük egy változón keresztül. Az ilyen módon létrehozott fájl azonban nem megfelelő a jövőben való működéshez, mivel a tmpfile () egy fogantyút visz vissza, és nem hivatkozik egy helyi fájlra. Menjünk egy kicsit mélyebben az ideiglenes fájl anatómiájába, és nézzük meg azokat a buktatókat, amelyekkel szembe kell néznem.

A tmpfile () függvény létrehoz egy erőforrást, mivel ezt fopen () teszi. és működik STDIO I / O streamekkel. Ez megegyezik azzal, hogy megnyitottuk a php: // temp streamet az ideiglenes fájlhoz való munkához. Mindkét esetben a fájl megjelenik az ideiglenes mappában, amely a php.ini fájlban van regisztrálva. és automatikusan törlődik, ha a szkript befejeződik, vagy előzetesen fclose () -nel.


Ha a php: // temp fájllal dolgozik, egy ideiglenes mappában hozza létre, ha az adatok mérete meghaladja a 2 MB-ot. Ezt megelőzően a rögzített adatok a php: // memóriában lesznek tárolva. Ez a korlátozás megkerülhető, ha azonnal belép a php: // temp / maxmemory: 0 streambe. - PHP

Mivel tmpfile () és a fopen (), hogy hozzon létre egy ideiglenes fájlba a munkafolyamat, fel tudjuk használni stream_get_meta_data () metaadatokat, és találja meg a valódi egy fájl elérési további manipuláció:

A stream_get_meta_data () által megadott értékek jól dokumentálva vannak a dokumentációban. de jobban érdekelnek a streamhez társított fájlnév. A tömbben található uri kulcs kiválaszthatja.

A php: // temp esetén semmilyen módon nem kaphatjuk meg az URI-t a metaadatokból, bár a fájl valójában egy ideiglenes mappában lesz létrehozva, ha annak súlya meghaladja a 2 MB-ot. Egy másik módja annak, hogy megtudja, hogy az ideiglenes fájlt fizikailag tárolják-e és milyen név alatt, amikor a szálakkal dolgozik, nem létezik.

Az erőforrás egyik tárgyról a másikra való eljuttatása szintén nem túl kényelmes, mert ehhez a megvalósításhoz szükséged lesz egy felületre. Az én esetemben át kellett adnom az ideiglenes fájl nevét a File class-lel a Symfony HttpFoundation csomagjából olyan objektumra, amely szigorú függéstől függött a szerkesztő File osztályától. Az alkalmazás üzleti logikája a fájl érvényesítését más szinten fogadta el, és fontos volt, ha a teszt sikertelen volt, a fájl elhárításakor ügyelni kell arra, hogy a fájl elején törölje a fájlt. Ekkor világossá vált, hogy a tmpfile () függvény nem alkalmas ideiglenes fájl létrehozására.

Egy alternatív megoldásnál saját mechanizmust írtam, amely a következőképpen működik: fájl létrehozása ideiglenes mappában> a fájlok manipulálása> automatikus törlés. Hozzon létre egy egyedi nevet tartalmazó fájlt az átmeneti mappában A PHP lehetővé teszi a tempnam () függvény használatát.

Az első argumentum határozza meg az ideiglenes mappa helyét a sys_get_temp_dir () segítségével. és a második a fájlnév előtagja. Egy ilyen fájlt csak a tulajdonosnak kell olvasni és megírni, mivel a 0600 (rw-) jogokkal jön létre. A fájl automatikus törlésének végrehajtásához azt javaslom, hogy a további logikát mozgassuk az osztályba, ahol a __destruct () paranccsal megpróbáljuk törölni a fájlt.

Az objektum visszaküldi a tempnam () függvény által létrehozott fájlt. mivel az __toString () osztályban regisztrált. Tehát megszabadítottuk az erőforrást. Maga a fájl törlődik, amikor az objektumra vonatkozó összes hivatkozás szabaddá válik, vagy amikor a szkript befejeződik, de amíg végzetes hiba nem kerül vagy kivételre kerül.


A destruktort akkor hívják, amikor az objektum megsemmisül. A kritikus hibák esetén a __destruct () nem nevezhető a PHP7-ben és az alábbiakban. A romboló nem hagyhatja el az objektumot instabil állapotban. Ezért PHP-ben az objektum megsemmisítésére és felszabadítására szolgáló kezelők egymástól elválnak. A kibocsátáskezelőt akkor hívják, ha a motor teljesen meg van győződve arról, hogy az objektumot már nem használják máshol. - Objektumok a PHP7-ben

A fájl törlése egy megsemmisítőn keresztül nem a legjobb gyakorlat, amelyet egyébként megfizethető megoldásokban használnak. A fájl garantált törléséhez regisztrálhatjuk a funkciót, amelyet minden esetben a szkript befejezése után hajtunk végre. Ez a regiszter_shutdown_function () függvényében történik osztályunk konstruktorában:

Ez a megközelítés lehetővé teszi, hogy ideiglenes fájlt hozzon létre a tmpfile () vagy php: // temp használata nélkül. hogy az OOP nagyon kényelmes. A szabványos módszerek előnyösebbek a helyi problémák megoldásához, ahol az összes logika egyetlen módszerrel vagy osztályba van beágyazva.

Az eredmény egy ideiglenes fájllal dolgozó osztály volt. Feladtam a forráskód repository Githabe denisyukphp / tmpfile és támogatást ad szifilisz-művelethez. Az írás és az olvasás módjai a file_put_contents () és a file_get_contents () csomagtartói. A zeneszerzőn keresztül csatlakozhat a projekthez.