Utolsó frissítés: 1.11.2015
A legtöbb programozási nyelvhez hasonlóan a PHP is támogatja a fájlokat, amelyek az információk tárolásának egyik módja.
Az fopen() függvény a PHP-ben van definiálva a fájlok megnyitásához. Ennek a következő meghatározása van: erőforrás fopen(string $fájlnév, string $mode) . Az első $fájlnév paraméter a fájl elérési útját, a második paraméter pedig a megnyitási módot jelöli. A megnyitás céljától és a fájl típusától függően ez a paraméter a következő értékeket veheti fel:
"r" : A fájl csak olvashatóként nyílik meg. Ha a fájl nem létezik, false értéket ad vissza
"r+" : A fájl csak olvashatóként és írhatóként nyílik meg. Ha a fájl nem létezik, false értéket ad vissza
"w" : A fájl írásra megnyílik. Ha már létezik ilyen fájl, akkor felülírja, ha nem, akkor létrejön.
"w+" : A fájl olvashatósággal nyílik meg írásra. Ha már létezik ilyen fájl, akkor felülírja, ha nem, akkor létrejön.
"a" : A fájl írásra megnyílik. Ha már létezik ilyen fájl, akkor az adatok a fájl végére íródnak, és a régi adatok megmaradnak. Ha a fájl nem létezik, akkor létrejön
"a+" : A fájl megnyílik olvasásra és írásra. Ha a fájl már létezik, akkor az adatok a fájl végéhez fűződnek. Ha a fájl nem létezik, akkor létrejön
Az fopen függvény eredménye egy fájlleíró. Ez a fogantyú a fájlon végzett műveletekhez és annak bezárásához használható.
Ha végzett, a fájlt be kell zárni az fclose() függvénnyel, amely paraméterként egy fájlleírót vesz fel. Például nyissunk meg és zárjunk be egy fájlt:
$fd = fopen("form.php", "r") or die("Nem sikerült megnyitni a fájlt"); fclose($fd);
Az or die ("hibaszöveg") konstrukció lehetővé teszi a szkript leállítását és valamilyen hibaüzenet megjelenítését, ha az fopen függvény nem tudta megnyitni a fájlt.
Egy fájl olvasásához számos funkció használható. A soronkénti olvasáshoz az fgets() függvényt használjuk, amely egy fájlleírót vesz fel, és egy olvasási sort ad vissza. Soroljuk végig a teljes fájlt:
Az fgets() minden egyes meghívásakor a PHP egy mutatót helyez el az olvasási karakterlánc végére. A fájl végének követéséhez a feof() függvényt használjuk, amely igazat ad vissza, amikor a fájl véget ér. És amíg el nem érjük a fájl végét, használhatjuk az fgets() függvényt.
Ebben az esetben nem kell kifejezetten megnyitnunk a fájlt, kapnunk kell egy kezelőt, majd bezárnunk a fájlt.
A fread() függvény segítségével blokkonkénti olvasást is végrehajthat, azaz bizonyos számú bájtot beolvashat egy fájlból:
A fread() függvény két paramétert igényel: az olvasandó fájlleírót és az olvasandó bájtok számát. Egy blokk beolvasásakor a fájlban a mutató a blokk végére mozog. És a feof () függvény segítségével nyomon követheti a fájl elkészültét.
Fájl írásához az fwrite() függvényt használjuk, amely egy karakterláncot ír a fájlba:
Egy másik fputs() függvény hasonlóan működik:
Amikor "w" módban nyit meg egy fájlt olvasásra vagy írásra, a fájlban lévő mutató a fájl elejére kerül. Olvasáskor PHP adatok a mutatót a fájlban az olvasott adatblokk végére mozgatja. Azonban manuálisan is módosíthatjuk a mutatót a fájlban, és tetszőleges helyre állíthatjuk. Ehhez a funkciót kell használni fseek, amelynek formális meghatározása a következő:
int fseek (forrás $handle , int $offset [, int $whence = SEEK_SET ])
A $handle paraméter egy fájlleírót jelöl. Az $offset paraméter az eltolás bájtokban annak a fájlnak az elejéhez képest, amelytől az olvasás/írás kezdődik. A harmadik opcionális paraméter határozza meg, hogyan kell beállítani az eltolást. Három értéket vehet fel:
SEEK_SET : alapértelmezett érték, az eltolást a fájl elejétől számított byte-okra állítja
SEEK_CUR: az eltolást a fájl aktuális pozíciójának kezdetéhez képest eltolási bájtra állítja
SEEK_END : az eltolást úgy állítja be, hogy a fájl végétől eltolja a bájtokat
Az fseek() függvény 0-t ad vissza, ha a mutatót sikeresen beállította, és -1-et, ha sikertelen.
Példa a függvény használatára:
$fd = fopen("hello.txt", "w+") or die("nem sikerült megnyitni a fájlt"); $str = "Szia világ!"; // string az íráshoz fwrite($fd, $str); // a karakterlánc beírása az elejére fseek($fd, 0); // a fájlmutatót az elejére helyezzük fwrite($fd, "Oink"); // a sort az elejére írjuk fseek($fd, 0, SEEK_END); // a mutatót a végére helyezzük fwrite($fd, $str); // írunk még egy sort a végére fclose($fd);
16,5KValójában a php fájl megnyitása nem nagy probléma. Az erdő közepén nehezebb lehet kinyitni egy üveg sört. De csak a lelkes programozók gondolják így. És kezdőknek beszéljünk a php összes funkciójáról a fájlokkal való munkához:
Fájlok innen php kiterjesztés az azonos nevű programozási nyelven írt kódot tartalmazzák. Más nyelvekkel ellentétben a php az szerver nyelve programozás. Vagyis a szerver oldalon fut. Ezért a kódjának hibakereséséhez helyi szervert kell telepíteni az ügyfélgépre.
A php fájlokkal való munkához speciális alkalmazásokat használnak - programszerkesztőket. Ezek közül a leggyakoribbak:
tartalmazza a fájlnevet
Csatlakozási példa:
Kapcsolt fájl:
Az include konstrukció csak a program végrehajtása során köti össze a forrást. Támogatja a php fájlok többszöri olvasását. Ha hiba történik, csak egy figyelmeztető üzenet jelenik meg, és a kód végrehajtása a következő sortól folytatódik.
A php-ben a fájlokkal végzett összes művelet több szakaszban történik:
Az fopen() függvény a fájl megnyitására szolgál. A szintaxisa a következő:
int fopen(karakterlánc fájlnév, karakterlánc mód [, int use_include_path])
Elfogadott érvek:
Az fclose() függvény a fájlokhoz való hozzáférés bezárására szolgál. Szintaxis:
int fclose (int fájl) , ahol az int fájl a bezárandó webhely kezelője.
Minden olvasás vagy írás után a fájlt be kell zárni ezzel a funkcióval. Ellenkező esetben a fájlhoz létrehozott adatfolyam nyitva marad. Ez pedig a szerverkapacitás szükségtelen fogyasztásához vezet.
Példa:
Mert egyszerű kijelző egy fájl teljes tartalmát, a readfile() függvény ideális. A szintaxisa a következő:
readfile (karakterlánc fájlnév) , ahol a fájlnév karakterlánc egy karakterlánc fájlnév (nem egy fájl leíró).
int fpassthru (int fájl)
A funkció használatához meg kell nyitnia és be kell zárnia a fájlt. Példa:
Az eredmény hasonló az előzőhöz.
A php fájlfunkciók lehetővé teszik a tartalom soronkénti és karakterenkénti olvasását:
Két azonos funkció létezik a szöveges adatok fájlba írásához:
A függvények a fájlba int fájlba írnak egy string string karakterláncot megadott hosszúságú int hosszúságú ( opcionális érv). Példa:
Php fájl létrehozásához használhatja az fopen() függvényt "w" vagy "w+" hozzáférési módban. Vagy a touch() függvény. Beállítja a fájl módosítási idejét. Ha nincs a keresett nevű elem, akkor az létrejön. A szintaxisa.
Az fopen, fclose, feof, fgets, fgetss és fscanf függvények használatáról
A modern programozási nyelvekkel, például a PHP-vel való munka egyik előnye a rendelkezésre álló funkciók száma. A PHP könnyen elsajátíthatja a Perl mottóját: "Valaminek több módja van", különösen akkor, ha beszélgetünk a fájlkezelésről. A rendelkezésre álló eszközök bősége miatt azonban felmerül a kérdés, hogy melyik a legjobb a munka elvégzéséhez. Természetesen a valóságban a kérdésre adott válasz attól függ, hogy milyen célokat tűz ki a fájl feldolgozása során, így a nyelv összes funkciójának megtanulása megéri a ráfordított időt.
Az fopen metódusok valószínűleg a legismertebbek a múltban a C és C++ programozók számára, mivel többé-kevésbé ezek azok az eszközök, amelyek évek óta a keze ügyében vannak, ha ezekkel a programozási nyelvekkel dolgozott. Ezen módszerek bármelyikénél kövesse a szabványos eljárást: az fopen-t a fájl megnyitásához, egy függvényt az adatok olvasásához, majd az fclose-t a fájl bezárásához, amint az az 1. listában látható.
Bár ezeket a funkciókat a legtöbb tapasztalt programozó ismeri, hadd elemzem, hogyan működnek. A valóságban a következő lépéseket hajtja végre:
Ezt szem előtt tartva, áttekintek minden itt használt fájlfunkciót.
Az fopen függvény kapcsolatot létesít egy fájllal. Azért mondom, hogy "csatlakozás", mert a fájl megnyitása mellett az fopen egy URL-t is megnyithat:
$fh = fopen("http://127.0.0.1/", "r");Ez a programsor hivatkozást hoz létre a fenti oldalra, és lehetővé teszi, hogy elkezdje olvasni helyi fájlként.
Jegyzet: Az fopenben használt "r" opció azt jelzi, hogy a fájl csak olvasható. Mivel a fájlba írás nem tartozik a cikk hatókörébe, nem sorolom fel a paraméter összes lehetséges értékét. Ha azonban bináris fájlokból olvas, a platformok közötti kompatibilitás érdekében módosítania kell az „r”-t „rb”-re. Az alábbiakban erre a típusra mutatunk be egy példát.
A feof parancs meghatározza, hogy a fájlt beolvasták-e a végéig, és visszatér igazi érték(igaz) vagy hamis (hamis). A hurok a "myfile" végéig folytatódik. Ne feledje, hogy a feof akkor is False értéket ad vissza, ha Ön egy URL-t olvas, és a kapcsolat időtúllépést szenvedett, mert nincs több olvasandó adat.
Hagyjuk ki az 1. lista közepét, és menjünk a végére; Az fclose az fopen ellenkezőjét teszi: bezárja a kapcsolatot egy fájlhoz vagy URL-hez. A funkció végrehajtása után többé nem fog tudni olvasni fájlból vagy socketből.
Az 1. listában néhány sort visszamegyünk a fájlfeldolgozási folyamat lényegéhez: magának a fájlnak az olvasásához. Az fgets függvény az a "fegyver", amelyet az első példához választottál. Megragad egy adatsort egy fájlból, és karakterláncként adja vissza. Innen lehet adatokat kiadni vagy más módon feldolgozni. Az 1. lista példája a teljes fájlt kinyomtatja.
Ha úgy dönt, hogy korlátozza annak az adatrésznek a méretét, amellyel dolgozik, hozzáadhat egy argumentumot az fgets-hez, hogy korlátozza a rögzített adatkarakterlánc maximális hosszát. Például használja a következő kódot egy karakterlánc 80 karakterre való korlátozásához:
$karakterlánc = fgets($file_handle, 81);Ne felejtse el a „\0”-t, a C sorvégi jelzőt, és állítsa be a hosszt egy karakterrel hosszabbra, mint amennyire valójában szüksége van. Amint láthatja, a fenti példa 81-et használ, ha 80 karakterre van szüksége. Tedd szokássá, hogy egy további karaktert adj hozzá, amikor karakterlánckorlátot kell beállítani ehhez a függvényhez.
Az fgets függvény csak egy a fájl olvasásához rendelkezésre álló számos funkció közül. Ez az egyik leggyakrabban használt funkció, mivel a legtöbb esetben a fájl soronkénti feldolgozása a legésszerűbb. Valójában számos más funkció is kínál hasonló képességeket. Bárhogy is legyen, a soronkénti elemzés nem mindig az, amire szüksége van.
És itt rátérünk Freadre. A fread függvényt kicsit más célra használják, mint az fgets: bináris fájlok (vagyis olyan fájlok, amelyek eredetileg nem ember által olvasható szövegből állnak) olvasására szolgál. Mivel a "sztringek" fogalma nem releváns a bináris fájlok esetében (a logikai adatstruktúrák általában nincsenek sorokra bontva), meg kell adni az olvasandó bájtok számát.
$fh = fopen("saját fájl", "rb"); $adat = fread($file_handle, 4096);A fenti példa 4096 bájt (4 KB) adatot olvas be. Ne feledje, hogy függetlenül attól, hogy milyen értéket ad meg, a fread legfeljebb 8192 bájtot (8 KB) fog olvasni.
Feltételezve, hogy a fájl nem nagyobb 8 KB-nál, az alábbi részletnek a teljes fájlt egy sorban kell olvasnia.
$fh = fopen("saját fájl", "rb"); $adat = fread($fh, fájlméret("saját fájl")); fclose($fh);Ha a fájl nagyobb, akkor egy ciklust kell használnia a többi részének beolvasásához.
Visszatérve a karakterlánc-feldolgozáshoz, az fscanf a hagyományos C fájlkönyvtár funkció utódja is. Ha nem ismerné, az fscanf az adatmezőket változókká olvassa be egy fájlból.
lista ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");Az ebben a függvényben használt formátum-karakterláncok számos forrásban dokumentálva vannak, például a PHP.net-ben, ezért ezeket az információkat itt nem ismétlem meg. Elég azt mondani, hogy a karakterlánc formázása nagyon rugalmas. Azt is meg kell említeni, hogy minden mező a függvény által visszaadott változóba kerül. (C-ben ezek argumentumként kerülnek átadásra.)
Az fgetss funkció eltér a hagyományos fájlfunkcióktól, és jobb képet ad a PHP képességeiről. Úgy működik, mint az fgets, de bármelyiket eldobja HTML címkék vagy PHP, csak a "csupasz" szöveget hagyva. Vegye ki a következő HTML-fájlt.
Ha megérted, hogy mit jelent a „Cause there ain”, hogy senki nem okoz fájdalmat”, akkor túl sokat hallgatsz az America zenekarból
Adjuk át az fgetss függvényen.
Íme, mit kapsz kimenetként:
A címem Ha érted, mit jelent a "Cause there ain" t senki nem okoz neked fájdalmat, akkor túl sokat hallgatsz az America zenekarbólFüggetlenül attól, hogy hogyan olvassa be az adatokat egy fájlból, a többi adatot kinyomtathatja a szabványos kimeneti cső használatával az fpassthru funkcióval.
fpassthru($fh);Ez a függvény kinyomtatja az adatokat, így nem kell változóba tenni.
Természetesen a fent leírt funkciókkal csak szekvenciálisan lehet olvasni egy fájlból. Az összetettebb fájlokat a fájl elején vagy végén a fájl különböző részeire kell mozgatni. Ehhez az fseek függvényre van szükség.
fseek($fh, 0);A fenti példa a fájl elejére ugrik vissza. Ha nem akar a fájl legelejére ugrani - mondjuk elég egy kilobájt -, akkor csak írja be:
fseek($fh, 1024);A PHP 4.0 verziójától kezdve számos más lehetőség is elérhető. Például, ha 100 bájtot kell előre ugrani az aktuális pozícióból, a következő kódot használhatja:
fseek($fh, 100, SEEK_CUR);Hasonlóképpen, a 100 bájttal visszaugrás a következőképpen történik:
fseek($fh, -100, SEEK_CUR);Ha a fájl vége előtt 100 bájttal szeretne visszaugrani, használja helyette a SEEK_END parancsot.
fseek($fh, -100, SEEK_END);Az új pozíció elérése után az fgets , az fscanf vagy más függvény segítségével kiolvashatja az adatokat.
Jegyzet: az fseek nem használható olyan fájlleíróknál, amelyek URL-re hivatkoznak.
Most rátérünk a PHP néhány egyedi fájlfeldolgozási képességére: nagy adattömbök egy vagy két sorban történő kezelésére. Például hogyan ragadhat meg egy fájlt és jelenítheti meg annak teljes tartalmát a weboldalán? Nos, láttál már példát az fgets ciklus használatára. De hogyan lehet megkönnyíteni? A folyamat szinte nevetségesen egyszerű az fgetcontents használatakor, amely a teljes fájlt egy karakterláncra helyezi.
$saját_fájl = file_get_contents("saját fájlnév"); echo $saját_fájl;Bár ez nem az a legjobb lehetőség, ezt a parancsot még rövidebben is kiírhatja:
echo file_get_contents("saját fájlnév");Ez a cikk elsősorban a helyi fájlok feldolgozásával foglalkozik, azonban érdemes megjegyezni, hogy a leírt funkciók segítségével más weboldalakat is rögzíthet, megjeleníthet és értelmezhet.
echo file_get_contents("http://127.0.0.1/");Ez a parancs valójában ugyanaz, mint:
$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);Bizonyára ezeket a példákat nézi, és azt gondolja: "Ez még mindig túl munkaigényes." A PHP fejlesztői egyetértenek Önnel. Tehát lerövidítheti a fenti parancsot a következőre:
readfile("http://127.0.0.1/");A readfile funkció egy fájl vagy weboldal teljes tartalmát az alapértelmezett kimeneti pufferbe írja ki. Alapértelmezés szerint ez a parancs hibaüzenetet nyomtat hiba esetén. Ennek elkerülése érdekében (ha akarja), próbálja ki a következő parancsot:
@readfile("http://127.0.0.1/");Természetesen, ha a fájlok tartalmát kell feldolgoznia, akkor a file_get_contents által visszaadott egyetlen sor valószínűleg túl sok. Érdemes először felosztani a split() függvénnyel.
$tömb = split("\n", file_get_contents("saját fájl"));De miért van szüksége erre a bonyolultságra, ha van egy tökéletesen megfelelő funkció, amely elvégzi ezt a munkát? PHP függvény A file() ezt a feladatot egy lépésben hajtja végre: egy string tömböt ad vissza, amelynek elemei a fájl sorai.
$tömb = fájl("sajátfájl");Meg kell jegyezni, hogy van egy kis különbség a fenti két példa között. A split parancs eltávolítja az újsorokat, míg a file parancs a tömbsorokat újsorokkal zárja (ugyanúgy, mint az fgets).
A PHP képességei azonban messze túlmutatnak a fent leírtakon. A teljes PHP-stílusú .ini fájlokat egyetlen parse_ini_file paranccsal elemezheti. A parse_ini_file parancs olyan fájlokra vonatkozik, mint a 4. lista.
A következő parancsok egy fájlt tömbként jelenítenek meg, majd kinyomtatják a tömböt:
$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;Ez a következő kimenetet eredményezi:
Ezt persze láthatod parancsot adott egyesített szakaszok. Ez az alapértelmezett művelet, de könnyen testreszabhatja a parse_ini_file második argumentumával: process_sections, amely egy logikai változó. Állítsa a process_sections értéket True értékre.
$file_array = parse_ini_file("holy_grail.ini", igaz); print_r $file_array;És a kimeneted így fog kinézni:
A PHP egy többdimenziós tömbbe helyezi az adatokat, amely könnyen értelmezhető.
De ez csak a jéghegy csúcsa, amikor a PHP fájlkezeléséről van szó. A fejlettebb funkciók, például a tidy_parse_file és az xml_parse segíthetnek a HTML- és XML-dokumentumok elemzésében. Ezen funkciók működésével kapcsolatos további információkért lásd a részt. Mindkettőt érdemes megfontolni, ha ilyen típusú fájlokkal dolgozik, de az összes lehetséges fájltípus figyelembevétele helyett figyelmesen olvassa el a cikk tartalmát, ahol van néhány jó. Általános szabályok az eddig leírt funkciókhoz.
Soha ne feltételezze, hogy a programban minden a tervezett módon fog működni. Például: mi van, ha a keresett fájlt áthelyezték? Mi van akkor, ha az engedélyek megváltozása miatt nem tudja elolvasni a fájl tartalmát? A file_exists és is_readable metódusokkal előzetesen ellenőrizheti a fájl létezését és az olvasási jogosultságokat.
A gyakorlatban azonban ez a kódrészlet valószínűleg túlzásba viszi a feladatot. Az fopen által visszaadott értékek kezelése egyszerűbb és pontosabb.
if ($fh = fopen($fájlnév, "r")) ( # Fclose($fh); )Mivel az fopen hiba esetén False értéket ad vissza, ez biztosítja, hogy a fájl csak akkor kerüljön feldolgozásra, ha a fájl megnyitható volt. Természetesen, ha a fájl nem létezik, vagy olvashatatlan, akkor a visszatérési érték negatív lesz. Ezért egy ilyen ellenőrzés csapda, amelybe minden lehetséges probléma beleesik. Alternatív megoldásként használhatja a programot a kilépéshez vagy hibaüzenet megjelenítéséhez, ha a fájl nem nyitható meg.
Az fopenhez hasonlóan a file_get_contents , file és readfile függvények False értéket adnak vissza, ha a fájlt nem lehet megnyitni vagy feldolgozni. Az fgets , fgetss , fread , fscanf és fclose függvények szintén hamis értéket adnak vissza hiba esetén. Természetesen az fclose kivételével valószínűleg már feldolgozta az általuk visszaadott eredményeket. Ami az fclose -t illeti, nem sokat tehetsz, ha a fájlleíró nincs megfelelően bezárva, ezért az fclose visszatérési értékének ellenőrzése általában felesleges.
A PHP nem hiányzik hatékony módszerek fájlok olvasása és elemzése. Az olyan klasszikus funkciók, mint a fread, legtöbbször jól szolgálhatnak, vagy jobban vonzódhat a readfile egyszerűségéhez, ha szükséges a munka elvégzéséhez. A választás valóban attól függ, hogy mit akar elérni.
Ha nagy mennyiségű adatot dolgoz fel, az fscanf valószínűleg hasznosabb és hatékonyabb, mint például a fájl használata a későbbi felosztási és sprintf parancsokkal. Másrészt, ha csak nagy mennyiségű szöveget jelenít meg kisebb változtatásokkal, akkor a file , file_get_contents vagy readfile függvények használata megfelelőbb lehet. Ez a megoldás valószínűleg helyes, ha a PHP-t gyorsítótárazásra vagy akár ideiglenes proxyszerver létrehozására használja.
A PHP számos eszközt biztosít a fájlokkal való munkavégzéshez. Nézze meg közelebbről mindegyiket, és derítse ki, mely eszközök a legalkalmasabbak az éppen futó projekthez. Széles választékot kínálnak Önnek szoftver eszközök, hozza ki belőlük a legtöbbet, és érezze jól magát a fájlok PHP-val történő feldolgozásával.