Kirjoita php-tiedoston loppuun. Työskentely tiedostojen kanssa php:ssä: avaaminen, kirjoittaminen, lukeminen

Tietoja funktioiden fopen, fclose, feof, fgets, fgetss ja fscanf käytöstä

Listataan kaikki mahdollisuudet

Yksi nykyaikaisten ohjelmointikielten, kuten PHP:n, kanssa työskentelyn eduista on saatavilla olevien ominaisuuksien määrä. PHP voisi helposti omaksua Perlin mottoa "On enemmän kuin yksi tapa tehdä jotain", varsinkin kun kyse on tiedostojen käsittelystä. Mutta koska käytettävissä on lukuisia työkaluja, kysymys tulee siitä, mikä niistä on paras työn suorittamiseen. Tietenkin vastaus tähän kysymykseen riippuu todellakin siitä, mitkä ovat tavoitteesi tiedoston käsittelyssä, joten kaikkien kielten ominaisuuksien oppiminen on vaivan arvoista.

Perinteiset fopen menetelmät

Fopen-menetelmät ovat luultavasti tutuimpia C- ja C++-ohjelmoijille ennen, koska ne ovat enemmän tai vähemmän työkaluja, jotka ovat olleet ulottuvillasi vuosia, jos olet työskennellyt näiden ohjelmointikielien kanssa. Kaikissa näissä menetelmissä noudatat vakiomenettelyä käyttämällä fopen-toimintoa tiedoston avaamiseen, funktiota tietojen lukemiseen ja sitten fclose-toimintoa sulkeaksesi tiedoston, kuten listassa 1 on esitetty.

Listaus 1. Tiedoston avaaminen ja lukeminen fgetsillä
$tiedoston_kahva = fopen("omatiedosto", "r"); while (!feof($tiedoston_kahva)) ( $rivi = fgets($tiedoston_kahva); echo $line; ) fclose($tiedoston_kahva);

Vaikka nämä toiminnot ovat tuttuja kokeneille ohjelmoijille, haluan analysoida, kuinka ne toimivat. Todellisuudessa noudatat näitä vaiheita:

  1. Avaa tiedosto. $file_handle tallentaa linkin itse tiedostoon.
  2. Tarkista, oletko saavuttanut tiedoston loppuun.
  3. Jatka tiedoston lukemista, kunnes tulet sen loppuun, ja tulosta jokainen lukemasi rivi.
  4. Sulje tiedosto.

Tätä silmällä pitäen tarkastelen jokaista tässä käytettyä tiedostotoimintoa.

fopen-toiminto

Fopen-toiminto muodostaa yhteyden tiedostoon. Sanon "muodostaa yhteyden", koska tiedoston avaamisen lisäksi fopen voi avata myös URL-osoitteen:

$fh = fopen("http://127.0.0.1/", "r");

Tämä ohjelmarivi luo linkin yllä olevalle sivulle ja mahdollistaa sen lukemisen paikallisena tiedostona.

Huomautus:"r"-vaihtoehto, jota käytetään fopenissa, osoittaa, että tiedosto on avoinna vain luku -tilassa. Koska tiedostoon kirjoittaminen ei sisälly tässä artikkelissa käsiteltyjen ongelmien piiriin, en luettele kaikkia parametrin mahdollisia arvoja. Sinun on kuitenkin vaihdettava "r" muotoon "rb", jos luet binääritiedostoista alustojen välisen yhteensopivuuden varmistamiseksi. Alla on esimerkki tästä tyypistä.

feof-toiminto

Feof-komento määrittää, onko luku saavuttanut tiedoston loppuun, ja palauttaa True vai False. Kohdassa näkyvä silmukka jatkuu tiedoston "myfile" loppuun asti. Huomaa, että feof palauttaa myös False, jos luet URL-osoitetta ja yhteys aikakatkaistiin, koska luettavaa dataa ei ole enää.

Toiminto fclose

Ohitetaan listan 1 keskikohta ja mennään loppuun; fclose toimii päinvastoin kuin fopen: se sulkee yhteyden tiedostoon tai URL-osoitteeseen. Tämän toiminnon suorittamisen jälkeen et voi enää lukea tiedostosta tai socketista.

fgets-toiminto

Palaamalla muutaman rivin taaksepäin listassa 1 pääset tiedostonkäsittelyprosessin ytimeen: itse asiassa tiedoston lukemiseen. Fgets-funktio on valitsemasi aseesi ensimmäisessä esimerkissä. Se nappaa datarivin tiedostosta ja palauttaa sen merkkijonona. Sieltä voit näyttää tiedot tai muuten käsitellä niitä. Listauksen 1 esimerkki tulostaa koko tiedoston.

Jos päätät rajoittaa käsittelemäsi tietokappaleen kokoa, voit lisätä fgets-argumentin rajoittamaan siepattavan tietojonon enimmäispituutta. Käytä esimerkiksi seuraavaa koodia rajoittaaksesi rivin pituus 80 merkkiin:

$merkkijono = fgets($tiedoston_kahva, 81);

Ajattele "\0", C:n rivin lopun ilmaisinta, ja aseta pituudeksi yksi merkki pidempään kuin itse tarvitset. Kuten näet, yllä olevassa esimerkissä käytetään 81 merkkiä, kun taas tarvitset 80 merkkiä. Ota tapa lisätä ylimääräinen merkki aina, kun sinun on asetettava rivin pituusrajoitus tietylle funktiolle.

fread-toiminto

Fgets-toiminto on vain yksi monista tiedoston lukemiseen käytettävissä olevista toiminnoista. Tämä on yksi yleisimmin käytetyistä toiminnoista, koska tiedoston käsittely rivi riviltä on useimmissa tapauksissa järkevintä. Itse asiassa useat muut ominaisuudet tarjoavat samanlaisia ​​ominaisuuksia. Oli miten oli, rivikohtainen analyysi ei aina ole sitä, mitä tarvitset.

Ja tästä päästään freadiin. Fread-funktiolla on hieman eri tarkoitus kuin fgetsillä: se on suunniteltu lukemaan binääritiedostoista (eli tiedostoista, jotka eivät alun perin koostu ihmisen luettavasta tekstistä). Koska "rivien" käsite ei ole merkityksellinen binääritiedostoille (loogisia tietorakenteita ei yleensä jaeta riveihin), sinun on määritettävä luettavien tavujen määrä.

$fh = fopen("omatiedosto", "rb"); $tiedot = fread($tiedoston_kahva, 4096);

Yllä oleva esimerkki lukee 4096 tavua (4 kt) dataa. Huomaa, että määrittämästäsi arvosta riippumatta fread lukee enintään 8192 tavua (8 kt).

Olettaen, että tiedosto ei ole suurempi kuin 8 kt, alla olevan ohjelmakatkelman pitäisi lukea koko tiedosto yhdellä rivillä.

$fh = fopen("omatiedosto", "rb"); $tiedot = fread($fh, tiedostokoko("omatiedosto")); fclose($fh);

Jos tiedostokoko on suurempi, sinun on käytettävä silmukkaa lukeaksesi loput tiedostosta.

fscanf-toiminto

Palatakseni merkkijonojen käsittelyyn, fscanf on myös perinteisen C-tiedostokirjastotoiminnon seuraaja. Jos et tunne sitä, fscanf lukee tietokentät tiedostosta muuttujiksi.

lista ($kenttä1, $kenttä2, $kenttä3) = fscanf($fh, "%s %s %s");

Tässä funktiossa käytetyt muotomerkkijonot on kuvattu monissa lähteissä, kuten PHP.net, joten en toista näitä tietoja tässä. Riittää, kun totean, että merkkijonojen muotoilu on erittäin joustavaa. On myös mainittava, että kaikki kentät sijoitetaan funktion palauttamaan muuttujaan. (C:ssä nämä välitetään argumentteina.)

fgetss-toiminto

Fgetss-funktio eroaa perinteisistä tiedostojenkäsittelytoiminnoista ja antaa sinulle paremman käsityksen PHP:n ominaisuuksista. Se toimii kuten fgets, mutta hylkää kaikki havaitsemansa HTML- tai PHP-tunnisteet jättäen vain paljaan tekstin. Otetaan alla oleva HTML-tiedosto.

Listaus 2. Esimerkki HTML-tiedostosta
Minun otsikkoni

Jos ymmärrät mitä tarkoittaa "Cause there ain"nobody for to give you no pain, niin kuuntelet liikaa Amerikkaa.

Ohjataan se fgetss-funktion läpi.

Listaus 3. Käyttämällä fgetss
$tiedoston_kahva = fopen("omatiedosto", "r"); while (!feof($tiedoston_kahva)) ( echo = fgetss($tiedoston_kahva); ) fclose($tiedoston_kahva);

Tämän saat ulostulona:

Otsikkoni Jos ymmärrät mitä tarkoittaa "Cause there ain"nobody for to give you no pain", niin kuuntelet liikaa Amerikkaa.

fpassthru-toiminto

Riippumatta siitä, kuinka luet tietoja tiedostosta, voit tulostaa loput tiedot käyttämällä vakiotulostuskanavaa käyttämällä fpassthru-toimintoa.

fpassthru($fh);

Tämä toiminto tulostaa tiedot, joten sinun ei tarvitse laittaa niitä muuttujaan.

Epälineaarinen tiedostonkäsittely: liikkuminen tiedoston läpi

Tietenkin yllä kuvatut toiminnot mahdollistavat vain peräkkäisen lukemisen tiedostosta. Monimutkaisemmat tiedostot saattavat edellyttää siirtämistä tiedoston eri osiin tiedoston alussa tai lopussa. Tätä varten tarvitset fseek-toiminnon.

fseek($fh, 0);

Yllä oleva esimerkki palaa tiedoston alkuun. Jos et halua siirtyä aivan tiedoston alkuun - vaikka yksi kilotavu riittää - kirjoitat vain:

fseek($fh, 1024);

PHP V4.0:sta lähtien saatavilla on myös useita muita vaihtoehtoja. Jos sinun on esimerkiksi siirryttävä eteenpäin 100 tavua nykyisestä sijainnistasi, voit käyttää seuraavaa koodia:

fseek($fh, 100, SEEK_CUR);

Samoin 100 tavua taaksepäin siirtäminen tapahtuu seuraavasti:

fseek($fh, -100, SEEK_CUR);

Jos haluat palata 100 tavun sijaintiin ennen tiedoston loppua, käytä sen sijaan SEEK_END.

fseek($fh, -100, SEEK_END);

Kun uusi sijainti on saavutettu, voit käyttää fgets-, fscanf- tai muuta toimintoa tietojen lukemiseen.

Huomautus: et voi käyttää fseek-tiedostoa URL-osoitteeseen viittaavissa tiedostokuvauksissa.

Kaappaa koko tiedosto

Nyt siirrymme tarkastelemaan joitain PHP:n ainutlaatuisia tiedostojenkäsittelyominaisuuksia: suurten tietolohkojen käsittelyä yhdellä tai kahdella rivillä. Miten voit esimerkiksi napata tiedoston ja näyttää sen koko sisällön Web-sivullasi? No, olet nähnyt esimerkin silmukan käyttämisestä fgets-komentojen kanssa. Mutta kuinka voimme tehdä siitä helpompaa? Prosessi on melkein naurettavan yksinkertainen käyttämällä fgetcontentsia, joka asettaa koko tiedoston riville.

$oma_tiedosto = file_get_contents("omatiedostonimi"); echo $oma_tiedosto;

Vaikka tämä ei ole paras vaihtoehto, voit kirjoittaa tämän komennon vielä lyhyemmin:

echo file_get_contents("omatiedostonimi");

Tämä artikkeli keskittyy ensisijaisesti paikallisten tiedostojen käsittelyyn, mutta on kuitenkin syytä huomata, että voit myös kaapata, näyttää ja jäsentää muita Web-sivuja kuvattujen toimintojen avulla.

echo file_get_contents("http://127.0.0.1/");

Tämä komento on itse asiassa sama kuin:

$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);

Saatat tarkastella näitä esimerkkejä ja ajatella: "Se on paljon työtä." PHP-kehittäjät ovat kanssasi samaa mieltä. Joten voit lyhentää yllä olevaa komentoa seuraavasti:

lukutiedosto("http://127.0.0.1/");

Readfile-toiminto tulostaa tiedoston tai Web-sivun koko sisällön oletustulostuspuskuriin. Oletuksena tämä komento näyttää virheilmoituksen, kun se epäonnistuu. Voit välttää tämän toiminnan (jos haluat sen) kokeilemalla komentoa:

@readfile("http://127.0.0.1/");

Tietenkin, jos sinun on käsiteltävä tiedostojen sisältö, tiedosto_get_contents palauttama yksi rivi on luultavasti liikaa. Haluat ehkä ensin jakaa sen osiin käyttämällä split()-funktiota.

$array = split("\n", file_get_contents("omatiedosto"));

Mutta miksi tarvitset kaikkea tätä monimutkaisuutta, jos on täysin sopiva toiminto, joka tekee työn puolestasi? PHP file()-funktio suorittaa tämän tehtävän yhdessä vaiheessa: se palauttaa merkkijonotaulukon, jonka elementit ovat tiedoston rivit.

$array = tiedosto("omatiedosto");

On huomattava, että kahden yllä olevan esimerkin välillä on pieni ero. Split-komento poistaa rivinvaihdot, kun taas tiedostokomento päättää rivinvaihdot rivinvaihdolla (kuten fgets).

PHP:n ominaisuudet ylittävät kuitenkin paljon edellä kuvatut. Voit jäsentää kokonaisia ​​.ini-tiedostoja PHP-tyylillä yhdellä parse_ini_file-komennolla. Parse_ini_file-komento koskee tiedostoja, jotka ovat samanlaisia ​​kuin luettelossa 4.

Listaus 4. Esimerkki .ini-tiedostosta
; Kommentin nimi = "Kuningas Arthur" -tehtävä = Graalin maljan etsiminen suosikkiväri = Sininen Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Seuraavat komennot edustavat tiedostoa taulukkona ja tulostavat sitten taulukon:

$file_array = parse_ini_file("holy_grail.ini"); print_r $tiedostojono;

Tuloksena on seuraava tulos:

Listaus 5. Lähtö
Array (=> Kuningas Arthur => Graalin maljan etsiminen => Sininen => Mark Twain => Whoopi Goldberg)

Saatat tietysti huomata, että tämä komento on yhdistänyt osat. Tämä on oletustoiminto, mutta voit muokata sitä helposti käyttämällä parse_ini_file-tiedoston toista argumenttia: process_sections, joka on Boolen muuttuja. Aseta process_sections arvoksi True.

$file_array = parse_ini_file("holy_grail.ini", tosi); print_r $tiedostojono;

Ja tulostuksesi näyttää tältä:

Listaus 6. Lähtö
Array ( => Array ( => Kuningas Arthur => Etsimään Pyhää Graalia => Sininen) => Array ( => Mark Twain => Whoopi Goldberg))

PHP sijoittaa tiedot helposti jäsennettävään moniulotteiseen taulukkoon.

Mutta tämä on vain jäävuoren huippu, kun kyse on tiedostojen käsittelystä PHP:llä. Monimutkaisemmat toiminnot, kuten tidy_parse_file ja xml_parse, voivat auttaa jäsentämään HTML- ja XML-asiakirjoja. Katso osiosta tarkempia tietoja näiden toimintojen toiminnasta. Molempia kannattaa harkita, jos työskentelet näiden tiedostotyyppien kanssa, mutta kaikkien mahdollisten tiedostotyyppien läpikäynnin sijaan sinun kannattaa tutustua tarkemmin tämän artikkelin sisältöön, jossa on hyviä yleisiä sääntöjä työskentelemään tähän mennessä kuvaamieni toimintojen kanssa.

Hyvä ohjelmointityyli

Älä koskaan oleta, että kaikki ohjelmassasi toimii tarkoitetulla tavalla. Esimerkiksi: entä jos etsimäsi tiedosto on siirretty? Entä jos käyttöoikeuksien muutos aiheuttaa sen, että et pysty lukemaan tiedoston sisältöä? Voit tarkistaa tiedoston olemassaolon ja sen lukuoikeudet etukäteen käyttämällä file_exists- ja is_readable -menetelmiä.

Listaus 7. File_exists ja is_readable -määritteiden käyttö
$tiedostonimi = "omatiedosto"; if (tiedosto_olemassa($tiedostonimi) && on_luettavissa ($tiedostonimi)) ( $fh = fopen($tiedostonimi, "r"); # Käsitellään fclose($fh); )

Käytännössä tämä ohjelma on kuitenkin todennäköisesti ylivoimainen tehtävällesi. Fopenin palauttamien arvojen käsittely on yksinkertaisempaa ja tarkempaa.

if ($fh = fopen($tiedostonimi, "r")) ( # Käsitellään fclose($fh); )

Koska fopen palauttaa False, jos se epäonnistuu, tämä varmistaa, että tiedosto käsitellään vain, jos tiedosto voidaan avata. Tietenkin, jos tiedostoa ei ole olemassa tai se on lukukelvoton, paluuarvon odotetaan olevan negatiivinen. Siksi tällainen tarkistus on ansa, johon kaikki mahdolliset ongelmat putoavat. Vaihtoehtoisesti voit poistua ohjelmasta tai näyttää virheilmoituksen, jos tiedostoa ei voida avata.

Kuten fopen, file_get_contents-, file- ja readfile-funktiot palauttavat False, jos tiedostoa ei voida avata tai käsitellä. Fgets-, fgetss-, fread-, fscanf- ja fclose-funktiot palauttavat myös epätosi, jos tapahtuu virhe. Tietenkin, paitsi fclose, olet todennäköisesti jo käsitellyt niiden palauttamat tulokset. Mitä tulee fclose -sovellukseen, ei ole paljon tehtävissä, jos tiedostokahva ei sulkeudu kunnolla, joten fclose-funktion palautusarvon tarkistaminen on yleensä ylivoimaista.

Päätös on sinun

PHP:llä ei ole pulaa tehokkaista tavoista lukea ja jäsentää tiedostoja. Klassiset toiminnot, kuten fread, voivat palvella sinua luotettavasti suurimman osan ajasta, tai voit houkutella enemmän readfile-tiedoston yksinkertaisuuteen, jos sitä tarvitset työsi suorittamiseksi. Valinta riippuu todellakin siitä, mitä yrität saada aikaan.

Jos käsittelet suuria tietomääriä, fscanf on todennäköisesti hyödyllisempi ja tehokkaampi kuin esimerkiksi tiedoston käyttäminen yhdessä myöhempien split- ja sprintf-komentojen kanssa. Jos näytät vain suuren määrän tekstiä pienin muutoksin, tiedosto-, file_get_contents- tai readfile-funktioiden käyttäminen voi olla järkevämpää. Tämä ratkaisu on todennäköisesti oikea käytettäessä PHP:tä välimuistiin tai jopa väliaikaisen välityspalvelimen luomiseen.

PHP tarjoaa monia työkaluja tiedostojen käsittelyyn. Tutustu jokaiseen paremmin ja selvitä, mitkä työkalut sopivat parhaisiin projektiin. Sinulle tarjotaan laaja valikoima ohjelmistotyökaluja, käytä niitä tehokkaimmin ja pidä hauskaa tiedostojesi käsittelyssä PHP:n avulla.

Ja nyt tulee olemaan melko suuri, mutta ei monimutkainen oppitunti tiedostojen käsittelystä PHP:ssä. Ensinnäkin, mitä varten tiedostot ovat? Loppujen lopuksi voit tallentaa kaiken MySQL- tai PostgreSQL-tietokantaan tai mihin tahansa muuhun tietokantaan. Mutta joskus on tehtäviä, kun tietokannan käyttäminen, kaikki käsittely ja yhteyden turvallisuudesta huolehtiminen, ei ole suositeltavaa. Esimerkiksi meidän on tehtävä tavallinen laskuri, mutta ennen tätä emme käyttäneet tietokantaa projektissa. Joten, pitäisikö meidän luoda yhden pienen laskurin vuoksi tietokanta ja tallentaa siihen vain muutama rivi? Täällä on paljon helpompaa käyttää tiedostoja. Lisäksi joskus hosting ei tue tietokantoja ollenkaan, jolloin tiedostot ovat yleensä ainoa vaihtoehto.

No, sanotaanpa, että olen vakuuttunut siitä, että tiedostot ovat välttämättömiä :) Nyt selvitetään kuinka käsitellä niitä. Kuinka luoda, avata, kirjoittaa, korvata, lukea ja niin edelleen. Ensimmäiset asiat ensin.

Luo tiedosto

PHP käyttää fopen-funktiota tiedostojen avaamiseen. Se voi kuitenkin myös luoda tiedostoja. Jos annat fopen-tiedoston nimen, jota ei ole olemassa, se luo sen.

Itse fopen-funktiolla on kaksi parametria, jotka molemmat vaaditaan. Ensinnäkin meidän on määritettävä avattavan tiedoston nimi. Toiseksi välitä parametri, joka selittää funktiolle, mitä aiomme tehdä tälle tiedostolle (esimerkiksi lukeminen tiedostosta, kirjoittaminen jne.).

Jos meidän on luotava tiedosto, määritämme sen nimen ja välitämme parametrin, jonka mukaan haluamme kirjoittaa siihen tietoja. Huomautus: Meidän on ehdottomasti kerrottava PHP:lle, mitä kirjoitamme tiedostoon, muuten se ei luo uutta tiedostoa.
Esimerkki:

$ourFileName = "testitiedosto.txt"; $ourFileHandle = fopen($ourFileName, "w") or die("ei voi avata tiedostoa"); fclose($ourFileHandle);

Ensimmäinen rivi $ourFileName = testFile.txt luo tiedoston, johon tallennamme tiedostonimen.
Toinen rivi $ourFileHandle = fopen($ourFileName, 'w') tai die("ei voi avata tiedostoa") luo tai avaa olemassa olevan tiedoston kirjoittamista varten. Tai se palauttaa viestin, ettei tiedostoa voi avata.
Kolmas rivi fclose($ourFileHandle) sulkee tiedoston. Se on itse asiassa yksinkertaista.

Tiedoston avausasetukset php:ssä

  • Ensimmäinen parametri 'r' (read) - avaa tiedoston vain luku -tilaan, siihen ei voi kirjoittaa.
  • Toinen parametri 'w' (kirjoita) – avautuu kirjoittamista varten. Tässä tapauksessa tallennus alkaa aina tiedoston alusta. Jos siellä on jo tietoa, se korvataan.
  • Kolmas parametri 'a' (append) - avaa tiedoston kirjoittamista varten, mutta liittää tiedoston loppuun, toisin kuin w.

Edistyneet asetukset:

  • Parametri 'r+' - avautuu sekä lukemiseen että kirjoittamiseen. Osoitin on tiedoston alussa.
  • Parametri 'w+' - avautuu sekä lukemiseen että kirjoittamiseen, MUTTA poistaa kaikki tiedostossa olleet tiedot!!!
  • parametri 'a+' - avautuu lukemista ja kirjoittamista varten, mutta osoitin on tiedoston lopussa.

Luonnollisesti vain yksi näistä parametreista voidaan välittää funktiolle, ei useita. Ne on korvattava X:n sijaan:

Fopen($Tiedostonnimi, "X")

Kirjoittaminen tiedostoon

No, nyt olemme avaneet tiedoston, valinneet tarvitsemamme parametrin, mitä seuraavaksi? Sinun täytyy kirjoittaa siihen jotain. Kuinka tehdä se? Käyttämällä fwrite-funktiota, joka ottaa parametreiksi osoittimen tiedostoon ja tekstirivin, jonka haluamme kirjoittaa. Esimerkki:

$myFile = "testitiedosto.txt"; $fh = fopen($myFile, "w") or die("ei voi avata tiedostoa"); $stringData = "Ensimmäinen rivi\n"; fwrite($fh, $stringData); $stringData = "Toinen rivi\ n n"; fwrite($fh, $stringData); fclose($fh);

Loimme tiedoston testFile.txt, osoitin siihen on tallennettu $fn-muuttujaan. Kirjoitimme siihen rivin "Ensimmäinen rivi" (lisäsimme rivin loppusymbolin \n loppuun) ja sitten "Toinen rivi". Sitten he sulkivat tiedoston.

HUOMIO!Älä koskaan unohda sulkea tiedostojasi! Muuten, jos komentosarjan suoritus päättyy epänormaalisti, tiedostojen tietoja ei tallenneta! Käytä fclosea aina töiden jälkeen!!!

Lukeminen tiedostosta

Olemme kirjoittaneet sen muistiin, nyt luetaan se! Ei sekään niin vaikeaa ole. Käytämme fread-toimintoa. Syötteenä annamme sille osoittimen tiedostoon ja tavujen lukumäärän, jotka haluamme lukea. Esimerkiksi yksi merkki on yhtä kuin yksi tavu (riippuen koodauksesta), haluamme lukea 5 merkkiä: $theData = fread($fh, 5).
Mutta jos meidän on saatava kaikki tiedostossa olevat tiedot, tarvitsemme tiedostokoko-funktion, joka palauttaa tiedoston tavujen määrän, joten jos tiedostokoko-funktion tulos välitetään freadille, niin hanki kaikki tiedot tiedostosta:

$myFile = "testitiedosto.txt"; $fh = fopen($omaTiedosto, "r"); $theData = fread($fh, tiedostokoko($omatiedosto)); fclose($fh); echo $theData;

Toivottavasti selitin sen selvästi.
Joskus on hyödyllistä lukea tiedosto rivi riviltä, ​​ei tavujen lukumäärän mukaan. Voit tehdä tämän freadin sijaan sinun tarvitsee vain käyttää fgets:iä:

$myFile = "testitiedosto.txt"; $fh = fopen($omaTiedosto, "r"); $theData = fgets($fh); fclose($fh); echo $theData;

Tämän seurauksena saamme ensimmäisen rivin testFile.txt-tiedostosta. Näin ollen, jotta voit käydä läpi kaikki rivit, joita sinun on käytettävä:

\n"; ?>

Nyt olet oppinut avaamaan tiedostoja lukemista, kirjoittamista tai molempia varten. Kirjoita niihin tietoja tai liitä ne päälle Apppend-toiminnolla ja lue myös tietoja niistä.

Ja nyt tulee olemaan melko suuri, mutta ei monimutkainen oppitunti tiedostojen käsittelystä PHP:ssä. Ensinnäkin, mitä varten tiedostot ovat? Loppujen lopuksi voit tallentaa kaiken MySQL- tai PostgreSQL-tietokantaan tai mihin tahansa muuhun tietokantaan. Mutta joskus on tehtäviä, kun tietokannan käyttäminen, kaikki käsittely ja yhteyden turvallisuudesta huolehtiminen, ei ole suositeltavaa. Esimerkiksi meidän on tehtävä tavallinen laskuri, mutta ennen tätä emme käyttäneet tietokantaa projektissa. Joten, pitäisikö meidän luoda yhden pienen laskurin vuoksi tietokanta ja tallentaa siihen vain muutama rivi? Täällä on paljon helpompaa käyttää tiedostoja. Lisäksi joskus hosting ei tue tietokantoja ollenkaan, jolloin tiedostot ovat yleensä ainoa vaihtoehto.

No, sanotaanpa, että olen vakuuttunut siitä, että tiedostot ovat välttämättömiä :) Nyt selvitetään kuinka käsitellä niitä. Kuinka luoda, avata, kirjoittaa, korvata, lukea ja niin edelleen. Ensimmäiset asiat ensin.

Luo tiedosto

PHP käyttää fopen-funktiota tiedostojen avaamiseen. Se voi kuitenkin myös luoda tiedostoja. Jos annat fopen-tiedoston nimen, jota ei ole olemassa, se luo sen.

Itse fopen-funktiolla on kaksi parametria, jotka molemmat vaaditaan. Ensinnäkin meidän on määritettävä avattavan tiedoston nimi. Toiseksi välitä parametri, joka selittää funktiolle, mitä aiomme tehdä tälle tiedostolle (esimerkiksi lukeminen tiedostosta, kirjoittaminen jne.).

Jos meidän on luotava tiedosto, määritämme sen nimen ja välitämme parametrin, jonka mukaan haluamme kirjoittaa siihen tietoja. Huomautus: Meidän on ehdottomasti kerrottava PHP:lle, mitä kirjoitamme tiedostoon, muuten se ei luo uutta tiedostoa.

Esimerkki:

$ourFileName = "testitiedosto.txt";

$ourFileHandle = fopen($ourFileName, "w") or die("ei voi avata tiedostoa");

fclose($ourFileHandle);

Ensimmäinen rivi $ourFileName = testFile.txt luo merkkijonomuuttujan, johon tallennamme tiedoston nimen.

Toinen rivi $ourFileHandle = fopen($ourFileName, 'w') tai die("ei voi avata tiedostoa") luo tai avaa olemassa olevan tiedoston kirjoittamista varten. Tai se palauttaa viestin, ettei tiedostoa voi avata.

Kolmas rivi fclose($ourFileHandle) sulkee tiedoston. Se on itse asiassa yksinkertaista.

Tiedoston avausasetukset php:ssä

Ensimmäinen parametri 'r' (read) - avaa tiedoston vain luku -tilaan, siihen ei voi kirjoittaa.

Toinen parametri 'w' (kirjoita) – avautuu kirjoittamista varten. Tässä tapauksessa tallennus alkaa aina tiedoston alusta. Jos siellä on jo tietoa, se korvataan.

Kolmas parametri 'a' (append) - avaa tiedoston kirjoittamista varten, mutta liittää tiedoston loppuun, toisin kuin w.

Edistyneet asetukset:

Parametri 'r+' - avautuu sekä lukemiseen että kirjoittamiseen. Osoitin on tiedoston alussa.

Parametri 'w+' - avautuu sekä lukemiseen että kirjoittamiseen, MUTTA poistaa kaikki tiedostossa olleet tiedot!!!

parametri 'a+' - avautuu lukemista ja kirjoittamista varten, mutta osoitin on tiedoston lopussa.

Luonnollisesti vain yksi näistä parametreista voidaan välittää funktiolle, ei useita. Ne on korvattava X:llä:

fopen($Tiedostonnimi, "X")

Kirjoittaminen tiedostoon

No, nyt olemme avaneet tiedoston, valinneet tarvitsemamme parametrin, mitä seuraavaksi? Sinun täytyy kirjoittaa siihen jotain. Kuinka tehdä se? Käyttämällä fwrite-funktiota, joka ottaa parametreiksi osoittimen tiedostoon ja tekstirivin, jonka haluamme kirjoittaa. Esimerkki:

$myFile = "testitiedosto.txt";

$fh = fopen($myFile, "w") or die("ei voi avata tiedostoa");

$stringData = "Ensimmäinen rivi";

fwrite($fh, $stringData);

$stringData = "Toinen rivi";

fwrite($fh, $stringData);

Loimme tiedoston testFile.txt, osoitin siihen on tallennettu $fn-muuttujaan. Kirjoitimme siihen rivin "Ensimmäinen rivi" (lopussa käytimme rivin loppusymbolia n) ja sitten "Toinen rivi". Sitten he sulkivat tiedoston.

HUOMIO! Älä koskaan unohda sulkea tiedostojasi! Muuten, jos komentosarjan suoritus päättyy epänormaalisti, tiedostojen tietoja ei tallenneta! Käytä fclosea aina töiden jälkeen!!!

Lukeminen tiedostosta

Olemme kirjoittaneet sen muistiin, nyt luetaan se! Ei sekään niin vaikeaa ole. Käytämme fread-toimintoa. Syötteenä annamme sille osoittimen tiedostoon ja tavujen lukumäärän, jotka haluamme lukea. Esimerkiksi yksi merkki on yhtä kuin yksi tavu (riippuen koodauksesta), haluamme lukea 5 merkkiä: $theData = fread($fh, 5).

Mutta jos meidän on saatava kaikki tiedostossa olevat tiedot, tarvitsemme tiedostokoko-funktion, joka palauttaa tiedoston tavujen määrän, joten jos tiedostokoko-funktion tulos välitetään freadille, niin hanki kaikki tiedot tiedostosta:

$myFile = "testitiedosto.txt";

$fh = fopen($omaTiedosto, "r");

$theData = fread($fh, tiedostokoko($omatiedosto));

Toivottavasti selitin sen selvästi.

$myFile = "testitiedosto.txt";

$fh = fopen($omaTiedosto, "r");

$theData = fgets($fh);

Tämän seurauksena saamme ensimmäisen rivin testFile.txt-tiedostosta. Näin ollen kaikkien rivien läpikäymiseksi sinun on käytettävä foreach-silmukkaa:

$rivit = tiedosto("testitiedosto.txt");

foreach($lines kuin $yksi_rivi)

echo $single_line . "
n";

Nyt olet oppinut avaamaan tiedostoja lukemista, kirjoittamista tai molempia varten. Kirjoita niihin tietoja tai liitä ne päälle Apppend-toiminnolla ja lue myös tietoja niistä.

Ennen kuin yrität käsitellä tiedostoa, on suositeltavaa varmistaa, että se on olemassa. Tämän ongelman ratkaisemiseksi käytetään yleensä kahta toimintoa:

file_exists() ja is_file().

File_exists()-funktio tarkistaa, onko tietty tiedosto olemassa. Jos tiedosto on olemassa, funktio palauttaa TRUE, muussa tapauksessa se palauttaa FALSE. File_exists()-funktion syntaksi on:

bool tiedosto_olemassa(merkkijonotiedosto)

Esimerkki tiedoston olemassaolon tarkistamisesta:

jos (!tiedosto_olemassa($tiedostonimi)) :

print "Tiedostoa $tiedostonimi ei ole olemassa!";

is_file()

Is_file()-funktio tarkistaa tietyn tiedoston olemassaolon ja sen, voidaanko sitä lukea/kirjoittaa. Pohjimmiltaan is_file() on vankempi versio tiedostosta file_exists(), joka tarkistaa paitsi onko tiedosto olemassa, myös voiko se lukea ja kirjoittaa tietoja:

bool is_file(merkkijonotiedosto)

Seuraava esimerkki näyttää, kuinka voit varmistaa, että tiedosto on olemassa ja että sille voidaan suorittaa toimintoja:

$tiedosto = "jokutiedosto.txt";

if (on_tiedosto($tiedosto)) :

print "Tiedosto $tiedosto on kelvollinen ja olemassa!";

print "Tiedostoa $file ei ole olemassa tai se ei ole kelvollinen tiedosto!";

Kun olet varmistanut, että haluttu tiedosto on olemassa ja että sillä voidaan suorittaa erilaisia ​​luku-/kirjoitustoimintoja, voit siirtyä seuraavaan vaiheeseen - tiedoston avaamiseen.

Filesize()-funktio palauttaa tiedoston koon (tavuina) annetulla nimellä tai FALSE virheen sattuessa. Filesize()-funktion syntaksi:

int tiedostokoko (merkkijono tiedostonimi)

Oletetaan, että haluat määrittää pastry.txt-tiedoston koon. Saadaksesi tarvittavat tiedot, voit käyttää fileize()-funktiota:

$fs = tiedostokoko("leivonnaiset.txt"); print "Pastry.txt on $fs tavua.";

Seuraava tulos näytetään:

Pastry.txt on 179 tavua.

Ennen kuin voit suorittaa tiedostolle toimintoja, sinun on avattava se ja liitettävä se tiedostonkäsittelyohjelmaan. Kun olet valmis käsittelemään tiedostoa, sinun on suljettava se. Näitä aiheita käsitellään seuraavassa osiossa.

Tiedostojen avaaminen ja sulkeminen

Ennen kuin voit suorittaa I/O:n tiedostolle, sinun on avattava se komennolla fopen().

Fopen()-funktio avaa tiedoston (jos se on olemassa) ja palauttaa kokonaisluvun -- nimeltään tiedostojen manipulaattori(tiedostokahva). fopen()-funktion syntaksi:

int fopen (merkkijonotiedosto, merkkijonotila [, int enable_path])

Avattava tiedosto voi olla paikallisessa tiedostojärjestelmässä, esiintyä vakiotulo-/lähtövirtana tai edustaa tiedostoa etäjärjestelmässä, joka on hyväksytty HTTP:n tai FTP:n kautta.

Tiedostoparametri voidaan määrittää useissa muodoissa, jotka on lueteltu alla:

Jos parametri sisältää paikallisen tiedoston nimen, fopen() avaa kyseisen tiedoston ja palauttaa kahvan.

Jos parametri on php://stdin, php://stdout tai php://stderr, vastaava vakiotulo/lähtövirta avataan.

Jos parametri alkaa http://-etuliitteellä, funktio avaa HTTP-yhteyden palvelimeen ja palauttaa määritetyn tiedoston kahvan.

Jos parametri alkaa ftp://-etuliitteellä, funktio avaa FTP-yhteyden palvelimeen ja palauttaa kahvan määritetylle tiedostolle. Tässä tapauksessa on kiinnitettävä erityistä huomiota kahteen asiaan: Jos palvelin ei tue passiivista FTP-tilaa, fopen()-kutsu epäonnistuu. Lisäksi FTP-tiedostot avataan joko lukemista tai kirjoittamista varten.

Passiivisessa tilassa toimiessaan YAR-palvelin odottaa yhteyksiä asiakkailta. Toimiessaan aktiivisessa tilassa palvelin muodostaa itse yhteyden asiakkaaseen. Oletusasetus on yleensä aktiivinen tila.

Mode-parametri määrittää kyvyn lukea tiedostoa ja kirjoittaa siihen. Taulukossa 7.1 luettelee joitakin arvoja, jotka määrittävät tiedoston avaustilan.

Taulukko 7.1. Tiedoston avaustilat

tila Kuvaus
Vain lukeminen. Nykyisen sijainnin osoitin asetetaan tiedoston alkuun
r+ Lue ja kirjoita. Nykyisen sijainnin osoitin asetetaan tiedoston alkuun
w Vain tallennus. Nykyisen sijainnin osoitin asetetaan tiedoston alkuun ja koko tiedoston sisältö tuhoutuu. Jos tiedostoa ei ole olemassa, toiminto yrittää luoda sen
w+ Lue ja kirjoita. Nykyisen sijainnin osoitin asetetaan tiedoston alkuun ja koko tiedoston sisältö tuhoutuu. Jos tiedostoa ei ole olemassa, toiminto yrittää luoda sen
a Vain tallennus. Nykyisen sijainnin osoitin on asetettu tiedoston loppuun. Jos tiedostoa ei ole olemassa, toiminto yrittää luoda sen
a+ Lue ja kirjoita. Nykyisen sijainnin osoitin on asetettu tiedoston loppuun. Jos tiedostoa ei ole olemassa, toiminto yrittää luoda sen

Jos valinnainen kolmas parametri include_path on 1, tiedostopolku on suhteessa php.ini-tiedostossa määritettyyn include-hakemistoon (katso luku 1).

Alla on esimerkki tiedoston avaamisesta fopen()-funktiolla. die()-kutsu, jota käytetään yhdessä funktion fopen() kanssa, antaa virheilmoituksen, jos tiedostoa ei voida avata:

$tiedosto = "käyttäjätiedot.txt"; // Joku tiedosto

$fh = fopen($tiedosto, "a+") or die("Tiedostoa ($tiedostoa) ei ole olemassa!");

Seuraava katkelma avaa yhteyden PHP-sivustoon (http://www.php.net):

$site = "http://www.php.net": // Palvelimeen pääsee HTTP:n kautta

$sh = fopen($site., "r"); //Liitä manipulaattori Php.net-hakemistosivuun

Työn päätyttyä tiedosto tulee aina sulkea komennolla fclose().

Fclose()-funktio sulkee tiedoston annetulla manipulaattorilla. Jos sulkeminen onnistuu, palautetaan TOSI, jos sulkeminen epäonnistuu, palautetaan FALSE. fclose()-funktion syntaksi:

int fclose (int manipulaattori)

Fclose()-funktio sulkee onnistuneesti vain ne tiedostot, jotka fopen()- tai fsockopen()-funktiot avasivat aiemmin. Esimerkki tiedoston sulkemisesta:

$tiedosto = "käyttäjätiedot.txt";

jos (tiedosto_olemassa($tiedosto)) :

$fh = fopen($tiedosto, "r");

// Suorita tiedostotoiminnot

print "Tiedostotiedostoa ei ole olemassa!";

Kirjoittaminen tiedostoon

Avoimille tiedostoille suoritetaan kaksi päätoimintoa: lukeminen ja kirjoittaminen.

Is_writeable()-funktio varmistaa, että tiedosto on olemassa ja että se on kirjoitettava. Kirjoitettavuus tarkistetaan sekä tiedostolle että hakemistolle. Is_writeable()-funktion syntaksi on:

bool is_writeable (merkkijonotiedosto)

Yksi tärkeä asia on huomata, että PHP toimii todennäköisesti verkkopalvelimen käyttämän käyttäjätunnuksen alla (yleensä "ei kukaan"). Esimerkki is_writeable():n käytöstä on annettu fwrite()-funktion kuvauksessa.

Fwrite()-funktio kirjoittaa merkkijonomuuttujan sisällön tiedostokäsittelijän määrittelemään tiedostoon. fwrite()-funktion syntaksi:

int fwrite(int manipulaattori, merkkijonomuuttuja [, int pituus])

Jos valinnainen pituusparametri välitetään funktiota kutsuttaessa, kirjoittaminen pysähtyy joko määritetyn merkkimäärän kirjoittamisen jälkeen tai kun rivin loppu saavutetaan. Seuraavassa esimerkissä näytetään, voidaanko tiedostoon kirjoittaa:

// Tietoja käyttäjäsivuston liikenteestä

$data = "08:13:00|12:37:12|208.247.106.187|Win98";

$tiedostonimi = "jokutiedosto.txt";

// Jos tiedosto on olemassa ja siihen voidaan kirjoittaa

if (on_writeable($tiedostonimi)) :

$fh = fopen($tiedostonimi, "a+");

// Kirjoita $data sisältö tiedostoon

$ menestys - fwrite($fh, $data);

// Sulje tiedosto

fclose($fh); muu:

print "Sfilename-tiedostoa ei voitu avata kirjoittamista varten";

Fputs()-funktio on alias funktiolle fwrite() ja sitä voidaan käyttää missä tahansa fwrite()-funktiota käytetään.

Fputs()-funktio on alias funktiolle fwrite() ja sillä on täsmälleen sama syntaksi. fputs()-funktion syntaksi:

int fputs(int manipulaattori, merkkijonomuuttuja [, int pituus])

Henkilökohtaisesti käytän mieluummin fputs(ia). On muistettava, että tämä on vain tyylikysymys, eikä sillä ole mitään tekemistä näiden kahden toiminnon välisten erojen kanssa.

Lukeminen tiedostosta

Lukeminen on epäilemättä tärkein tiedostoille suoritettava toimenpide. Alla on joitain ominaisuuksia, jotka tekevät tiedostosta lukemisesta tehokkaampaa. Näiden toimintojen syntaksi kopioi melkein täsmälleen samanlaisten tallennustoimintojen syntaksin.

Funktiolla i s_readable() voit varmistaa, että tiedosto on olemassa ja että se on luettavissa. Luettavuus tarkistetaan sekä tiedoston että hakemiston osalta. Is_readable()-funktion syntaksi on:

höh! is_readable(merkkijonotiedosto]

Todennäköisesti PHP toimii verkkopalvelimen käyttämän käyttäjätunnuksen alla (yleensä "nobody"), joten jotta is_readable()-funktio palauttaisi TOSI, kaikkien on sallittava tiedoston lukeminen. Seuraava esimerkki näyttää, kuinka voit varmistaa, että tiedosto on olemassa ja että se on luettavissa:

if (on_luettava($tiedostonimi)) :

// Avaa tiedosto ja aseta nykyisen sijainnin osoitin tiedoston loppuun

$fh = fopen($tiedostonimi, "r");

print "$tiedostonimi ei ole luettavissa!";

Fread()-funktio lukee määritetyn määrän tavuja tiedostonkäsittelyohjelman määrittämästä tiedostosta. fwrite()-funktion syntaksi:

int fread (int manipulaattori, int pituus)

Manipulaattorin on viitattava avoimeen tiedostoon, joka on luettavissa (katso is_readable()-funktion kuvaus). Lukeminen pysähtyy, kun tietty määrä tavuja on luettu tai kun tiedoston loppu on saavutettu. Harkitse tekstitiedostoa pastry.txt, joka näkyy luettelossa 7.1. Tämän tiedoston lukeminen ja tulostaminen selaimessa suoritetaan seuraavalla fragmentilla:

$fh = fopen("pastry.txt", "r") or die("Tiedostoa ei voi avata!");

$tiedosto = fread($fh, tiedostokoko($fh));

Käyttämällä fllesize()-funktiota määrittämään pastry.txt-tiedoston koon tavuina, varmistat, että fread()-funktio lukee koko tiedoston sisällön.

Listaus 7.1. Tekstitiedosto pastry.txt

Resepti: Leivonnainen taikina

1 1/4 kuppia yleisjauhoja

3/4 tikkua (6 ruokalusikallista) suolatonta voita, hienonnettu

2 rkl kasvislyhennystä 1/4 tl suolaa

3 ruokalusikallista vettä

Fgetc()-funktio palauttaa merkkijonon, joka sisältää yhden merkin tiedostosta osoittimen nykyisessä paikassa tai FALSE, kun tiedoston loppu saavutetaan. fgetc()-funktion syntaksi:

merkkijono fgetc (int manipulaattori)

Manipulaattorin on viitattava avoimeen tiedostoon, joka on luettavissa (katso is_readable()-funktion kuvaus aiemmin tässä luvussa). Seuraava esimerkki havainnollistaa tiedoston lukemisen ja tulostamisen merkki kerrallaan fgetc()-funktiolla:

$fh = fopen("leivonnaiset.txt", "r"); while (!feof($fh)) :

$char = fgetc($fh):

tulosta $char; loppuun asti;

Fgets()-funktio palauttaa tiedostonkäsittelijän määrittämän tiedoston nykyisestä osoittimen sijainnista luetun merkkijonon. Tiedostoosoittimen tulee osoittaa avointa tiedostoa, joka on luettavissa (katso is_readable()-funktion kuvaus aiemmin tässä luvussa). fgets()-funktion syntaksi:

merkkijono fgets (int manipulaattori, int pituus)

Lukeminen pysähtyy, kun jokin seuraavista ehdoista täyttyy:

  • lukea tiedoston pituudesta -- 1 tavu;
  • rivinvaihtomerkki luettiin tiedostosta (sisältyy palautettavaan merkkijonoon);
  • Tiedoston loppu (EOF) -lippu on luettu tiedostosta.

Jos haluat järjestää tiedoston luku riviltä, ​​anna toiselle parametrille arvo, joka on selvästi suurempi kuin rivin tavujen määrä. Esimerkki tiedoston rivi riviltä lukemisesta ja tulostamisesta:

$fh = fopen("leivonnaiset.txt", "r");

while (!feof($fh));

$rivi = fgets($fh, 4096);

tulosta $rivi. "
";

Funktio fgetss() on täysin samanlainen kuin fgets() yhdellä poikkeuksella - se yrittää poistaa kaikki HTML- ja PHP-tunnisteet luetusta tekstistä:

merkkijono fgetss (Int-manipulaattori, int-pituus [, merkkijono sallittu_tunnisteet])

Ennen kuin siirryt esimerkkeihin, tarkista listan 7.2 sisältö – tätä tiedostoa käytetään luetteloissa 7.3 ja 7.4.

Listaus 7.2. Tiedosto science.html

Breaking News - Tiede

Muukalainen elämänmuoto löydetty


20. elokuuta 2000

Varhain tänä aamuna W. J. Gilmoren vanhan asunnon jääkaapin kaapista löydettiin uusi outo sieni. Ei tiedetä, auttoiko vuokralaisen tietokoneen näytöstä lähtevä voimakas säteily tätä kehitystä.

Listaus 7.3. Tunnisteiden poistaminen HTML-tiedostosta ennen sen näyttämistä selaimessa

$fh = fopen("tiede.html", "r");

while (!feof($fh)) :

tulosta fgetss($fh, 2048);

Tulos näkyy alla. Kuten näet, kaikki HTML-tunnisteet on poistettu science.html-tiedostosta, mikä on aiheuttanut muotoilun menettämisen:

Joissakin tilanteissa tiedostosta poistetaan muutamaa lukuun ottamatta kaikki - esimerkiksi rivinvaihtotunnisteet
. Lista 7.4 näyttää, kuinka tämä tehdään.

Listaus 7.4. Tunnisteiden valikoiva poistaminen HTML-tiedostosta

$fh = fopenC"tiede.html", "r");

$sallittu = "
";

while (!feof($fh)) :

tulosta fgetss($fh. 2048, $allowable);

Tulos:

Breaking News - Science Alien -elomuoto löydettiin 20. elokuuta 2000 Varhain tänä aamuna W. J. Gilmoren vanhan asunnon jääkaapin kaapista löydettiin uusi, outo sieni. Ei tiedetä, auttoiko vuokralaisen tietokoneen näytöstä lähtevä voimakas säteily evoluutio.

Kuten näet, fgetss()-funktio tekee tiedostojen muuntamisesta helppoa, varsinkin kun sinulla on suuri määrä samalla tavalla muotoiltuja HTML-tiedostoja.

Tiedoston lukeminen taulukkoon

File()-funktio lataa tiedoston koko sisällön indeksoitavaan taulukkoon. Jokainen taulukon elementti vastaa yhtä tiedoston riviä. File()-funktion syntaksi:

taulukkotiedosto (merkkijonotiedosto [, int include_path])

Jos valinnainen kolmas parametri include_path on 1, tiedostopolku on suhteessa php.ini-tiedostossa määritettyyn include-hakemistoon (katso luku 1). Listaus 7.5 käyttää file()-funktiota pastry.txt-tiedoston lataamiseen (katso listaus 7.1).

$tiedosto_jono = tiedosto("leivonnaiset.txt");

while (list($rivin_nm. $rivi) = everyt($file_array)):

Tulosta " Rivi $line_num:", htmlspecialchars($line), "
\n"

Jokainen taulukon rivi tulostetaan yhdessä numeron kanssa:

Rivi 0: Resepti: Leivonnaiset

Rivi 1: 1 1/4 kuppia yleisjauhoja

Rivi 2: 3/4 tikkua (6 ruokalusikallista) suolatonta voita, hienonnettu

Rivi 3: 2 rkl kasvislyhennystä

Rivi 4: 1/4 tl suolaa

Rivi 5: 3 ruokalusikallista vettä

Tiedoston uudelleenohjaus vakiolähtöön

Readfile()-funktio lukee tiedoston sisällön ja kirjoittaa sen vakiolähtöön (useimmissa tapauksissa selaimeen). readfile()-funktion syntaksi:

int lukutiedosto (merkkijonotiedosto [, int include_path])

Funktio palauttaa luettujen tavujen määrän. Tiedosto voi sijaita paikallisessa tiedostojärjestelmässä, olla vakiotulona/lähtönä tai edustaa tiedostoa etäjärjestelmässä, joka on hyväksytty HTTP:n tai FTP:n kautta. Tiedostoparametri asetetaan samojen sääntöjen mukaan kuin fopen()-funktiossa.

Oletetaan, että sinulla on tiedosto latorre.txt, jonka sisällön haluat näyttää selaimessa:

Ravintola "La Torre". sijaitsee Nettunossa, Italiassa, ja tarjoaa eklektisen sekoituksen tyyliä. historiaa ja hienoja kalaruokia. Kaupunkia ympäröivän keskiaikaisen borgon seinien sisällä voi ruokailla samalla kun katsot ohikulkijoiden ostoksia kylän putiikeissa. Mukavuus yhdistettynä vain tuoreimpiin merenkuluihin tekevät La Torresta yhden Italian hienoimmista ravintoloista.

Kun seuraava katkelma suoritetaan, latorre.txt-tiedoston koko sisältö lähetetään vakiotulostukseen:

$ravintola_tiedosto = "latorre.txt";

// Lähetä koko tiedosto vakiolähtöön

lukutiedosto($ravintola_tiedosto);

Prosessitiedoston käsittelijän avaaminen

Tavallisten tiedostojen lisäksi voit avata tiedostomanipulaattoreita vuorovaikutuksessa palvelimen prosessien kanssa. Ongelman ratkaisee popen()-funktio, jolla on seuraava syntaksi:

int popen (merkkijono komento, merkkijonotila)

Komentoparametri määrittää suoritettavan järjestelmäkomennon ja mode-parametri kuvaa pääsytilan:

// Avaa tiedosto "spices.txt" kirjoittamista varten

$fh = fopen("mausteet.txt","w");

// Lisää muutama rivi tekstiä

fputs($fh, "Persilja, salvia, rosmariini\n");

fputs($fh, "paprika, suola, pippuri\n");

fputs($fh, "basilika, salvia, inkivääri\n");

// Sulje manipulaattori

// Avaa UNIX-grep-prosessi etsiäksesi sanaa Basil spices.txt-tiedostosta

$fh - popen("grep Basil< spices.txt", "r");

// Tulosta grep-tulos

Tulos näyttää tältä:

Basilika, salvia, inkivääri

Fpassthru()-funktio on samanlainen kuin passthru()-funktio, jota on käsitelty tämän luvun "Ulkoisten ohjelmien suorittaminen" -osiossa.

Kun kaikki toiminnot on suoritettu, tiedosto tai prosessi on suljettava. Pclose()-funktio sulkee yhteyden manipulaattorin määrittelemään prosessiin, samalla tavalla kuin fclose()-funktio sulkee fopen()-funktiolla avatun tiedoston. pclose()-funktion syntaksi:

int pclose (int manipulaattori)

Parametrissa manipulaattori manipulaattori, joka vastaanotettiin aiemmin onnistuneella popen()-kutsulla, lähetetään.

Pistorasian avaaminen

PHP ei rajoitu vuorovaikutukseen tiedostojen ja prosessien kanssa – voit myös muodostaa yhteyksiä pistokkeiden kautta. Pistorasia Socket on ohjelmiston abstraktio, jonka avulla voit kommunikoida eri palvelujen kanssa toisella tietokoneella.

Fsockopen()-funktio muodostaa socket-yhteyden Internetissä olevaan palvelimeen

TCP- tai UDP-protokollan kautta. fsockopen()-funktion syntaksi:

int fsockopen (merkkijonosolmu, int-portti [, int error_code [, merkkijono error_text [, int timeout]]])

Valinnaiset parametrit error_code ja error_text sisältävät tietoja, jotka näytetään, jos yhteys palvelimeen epäonnistuu. Molemmat parametrit on välitettävä viitteellä. Kolmas valinnainen parametri, aikakatkaisu, määrittää ajan, jonka kuluttua palvelimen vastausta odotetaan (sekunteina). Listaus 7.6 osoittaa fsockopen()-funktion käyttämisen palvelintietojen hankkimiseen. Ennen kuin katsot listaa 7.6, on kuitenkin vielä yksi funktio, johon sinun on tutustuttava: socket_set_blocking().

UDP (User Datagram Protocol) on yhteydetön viestintäprotokolla.

socket_set_blocking()

Socket_set_b1ocki ng()-funktion avulla voit asettaa aikakatkaisun hallinnan palvelintoimintoille:

socket_set_blocking(int manipulaattori, boolen tila)

Manipulaattoriparametri määrittää aiemmin avatun pistorasian, ja mode-parametri valitsee tilan, johon liitin kytketään (TRUE estotilalle, FALSE ei-estotilalle). Esimerkki funktioiden fsockopen() ja socket_set_blocking() käytöstä on esitetty listauksessa 7.6.

Listaus 7.6. Käyttämällä fsockopen() palvelintietoja

funktio getthehost($host.$path) (

// Avaa yhteys solmuun

$fp - fsockopen($isäntä, 80, &$errno, &$errstr, 30);

// Siirry estotilaan

socket_set_blocking($fp, 1),

// Lähetä otsikot

fputs($fp,"GET $polku HTTP/1.1\r\n");

fputs($fp, "Isäntä: $isäntä\r\n\r\n"); $x = 1;

// Hae otsikot

while($x< 10) :

$otsikot = fgets($fp, 4096);

// Sulje manipulaattori

getthehost("www. apress.com", "/");

Käynnissä oleva listaus 7.6 tuottaa seuraavan tuloksen:

HTTP/1.1 200 OK Palvelin: Microsoft-IIS/4.0 Sisällön sijainti:

2000 20:25:06 GMT ETag: "f0a61666dbff1bf1:34a5" Sisällön pituus: 1311

Pfsockopen()-funktio on fsockopen()-funktion pysyvä versio. Tämä tarkoittaa, että yhteyttä ei suljeta automaattisesti, kun komentosarja, jossa funktiota kutsuttiin, päättyy. Pfsockopen()-funktion syntaksi on:

int pfsockopen (merkkijonosolmu, int-portti [, int error_code [, merkkijono error_text [, int timeout]]])

Sovelluksesi erityistavoitteista riippuen saatat olla kätevämpää käyttää pfsockopen():tä fsockopen():n sijaan.

Ulkoisten ohjelmien käynnistäminen

PHP-skriptit voivat myös suorittaa palvelimella olevia ohjelmia. Tätä ominaisuutta käytetään erityisen usein järjestelmän hallinnassa verkkoselaimen kautta sekä järjestelmän yhteenvetotietojen hankkimiseen kätevämmin.

Exec()-funktio suorittaa tietyn ohjelman ja palauttaa sen tulosteen viimeisen rivin. Exec()-funktion syntaksi:

merkkijono exec (merkkijono komento [, merkkijonotaulukko [, int return]])

Huomaa, että exec()-funktio suorittaa vain komennon eikä tulosta sen tuloksia. Kaikki komennon tulosteet voidaan tallentaa valinnaiseen taulukkoparametriin. Lisäksi, jos myös paluumuuttuja määritetään taulukkoparametria määritettäessä, jälkimmäiselle annetaan suoritetun komennon palautuskoodi.

Lista 7.7 näyttää, kuinka exec()-funktiota käytetään UNIX-ping-järjestelmän funktion suorittamiseen.

Listaus 7.7. Tarkistetaan yhteyttä palvelimeen käyttämällä exec()-funktiota

exec("ping - 5:stä www.php.net", $ping);

// Windowsissa - exec("ping -n 5 www.php.net. $ping);

for ($i=0; $i< count($ping);$i++) :

Tulosta "
$ping[$i]";

Tulos:

PING www.php.net (208.247.106.187): 56 datatavua

64 tavua tiedostosta 208.247.106.187: icmp_seq=0 ttl=243 aika=66.602 ms

64 tavua tiedostosta 208.247.106.187: icmp_seq=1 ttl=243 aika=55.723 ms

64 tavua tiedostosta 208.247.106.187: icmp_seq=2 ttl=243 aika=70.779 ms

64 tavua tiedostosta 208.247.106.187: icmp_seq=3 ttl=243 aika=55.339 ms

64 tavua tiedostosta 208.247.106.187: icmp_seq=4 ttl=243 aika=69.865 ms

www.php.net ping-tilastot --

5 pakettia lähetetty. 5 pakettia vastaanotettu. 0 % pakettihäviö

edestakainen min/avg/max/stddev - 55,339/63,662/70,779/6,783 ms

Takaisin heittomerkit

On toinenkin tapa suorittaa järjestelmäkomentoja, jotka eivät vaadi kutsutoimintoja - suoritettava komento on suljettu backticksillä (` `), ja sen toiminnan tulokset näkyvät selaimessa. Esimerkki:

Tulosta "

$tulostus
";

Tämä katkelma näyttää sen hakemiston sisällön, jossa komentosarja sijaitsee selaimessa.

Sisäinen parametri ping -c 5 (-p 5 Windowsissa) määrittää palvelinkyselyiden määrän.

Jos haluat vain palauttaa komennon muotoilemattomat tulokset, käytä alla kuvattua passthru()-funktiota.

Passthru()-funktio toimii paljolti samalla tavalla kuin exec(), yhdellä poikkeuksella - se tulostaa automaattisesti komennon tulokset. Pasthru()-funktion syntaksi on:

void passthru (merkkijono komento [, int return])

Jos valinnainen paluuparametri välitetään kutsuttaessa passthru(), tämä muuttuja asetetaan suoritetun komennon palautuskoodiksi.

escapeshellcmd()

Escapeshellcmd()-funktio välttää kaikki mahdollisesti vaaralliset merkit, joita käyttäjä saattaa kirjoittaa (esimerkiksi HTML-lomakkeelle) suorittaakseen exec(), passthru(), system() tai popen()-komentoja. Syntaksi:

merkkijono escapeshellcmd (merkkijono komento)

Käyttäjän syötteisiin tulee aina suhtautua varoen, mutta silti käyttäjät voivat syöttää komentoja, jotka järjestelmän komentofunktiot suorittavat. Harkitse seuraavaa katkelmaa:

$user_input = `rm -rf *`; // Poista emohakemisto ja kaikki sen alihakemistot

exec($käyttäjän_syöttö); // Suorita $user_input !!!

Jos varotoimiin ei ryhdytä, tällainen komento johtaa katastrofiin. Voit kuitenkin käyttää escapeshellcmd()-funktioita välttääksesi käyttäjän syötteen:

$user_input = `rm - rf *`; // Poista emohakemisto ja kaikki sen alihakemistot

ex(escapeshellcmd($käyttäjän_syöttö)); // Pakene vaarallisia hahmoja

Escapeshellcmd()-funktio välttää *-merkin, mikä estää komennolla olevan katastrofaalisia seurauksia.

Turvallisuus on yksi web-ohjelmoinnin tärkeimmistä näkökohdista, joten omistin kokonaisen luvun tälle aiheelle ja sen suhteelle PHP-ohjelmointiin. Katso lisätietoja luvusta 16.

Työskentely tiedostojärjestelmän kanssa

PHP:llä on toimintoja palvelimella olevien tiedostojen katseluun ja suorittamiseen. Tietoa palvelintiedostojen määritteistä (sijainti, omistaja ja käyttöoikeudet) on usein hyödyllistä.

Basename()-funktio poimii tiedostonimen välitetystä koko nimestä. Basename()-funktion syntaksi:

merkkijonon perusnimi(merkkijono koko_nimi)

Perustiedostonimen purkaminen koko nimestä tapahtuu seuraavasti:

$polku = "/usr/local/phppower/htdocs/index.php"; $tiedosto = perusnimi($polku); // $tiedosto = "index.php"

Käytännössä tämä toiminto poistaa polun koko nimestä ja jättää vain tiedoston nimen.

Getlastmod()-funktio palauttaa sen sivun viimeisen muokkauksen päivämäärän ja kellonajan, jolta funktiota kutsutaan. Getlastmod()-funktion syntaksi:

int getlastmod (tyhjä)

Palautusarvo noudattaa UNIX-päivämäärä/aika -muotoa, ja voit muotoilla sen käyttämällä date()-funktiota. Seuraava koodinpätkä näyttää päivämäärän, jolloin sivua viimeksi muokattiin:

echo "Muokattu viimeksi: ".date("H:i:s a". getlastmod());

Stat()-funktio palauttaa indeksoitavan taulukon, jossa on yksityiskohtaisia ​​tietoja tietynnimisestä tiedostosta:

array stat (merkkijono tiedostonimi)

Seuraavat tiedot palautetaan taulukon elementeissä:

0 Laite

2 Indeksisolmun suojaustila

3 Linkkien määrä

4 Omistajan käyttäjätunnus

5 Omistajaryhmän tunnus

6 Indeksisolmun laitetyyppi

7 Koko tavuina

8 Viimeisen puhelun aika

9 Viimeisimmän muokkauksen aika

10 Viimeksi muokattu aika

11 Lohkon koko tiedostojärjestelmän I/O:lle

12 Varattujen lohkojen lukumäärä

Jos siis haluat tietää, milloin tiedostoa on viimeksi käytetty, katso palautetun taulukon elementtiä 8. Katsotaanpa esimerkkiä:

$tiedosto - "datatiedosto.txt";

lista($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $koko, $atime, $mtime, $ctime,

$bsize) = stat($tiedosto);

tulosta "$tiedosto on $koko tavua.
";

tulosta "Viimeinen käyttöaika: $atime
";

tulosta "Viimeisen muokkauksen aika: $mtime
";

Tulos:

popen.php on 289 tavua.

Viimeinen käyttöaika: 15. elokuuta 2000 12:00:00

Viimeisin muutosaika: 15. elokuuta 2000 10:07:18

Tässä esimerkissä käytin lista()-rakennetta nimen antamiseen jokaiselle palautusarvolle. Tietysti voit yhtä helposti palauttaa taulukon, selata elementtejä ja näyttää kaikki tarvittavat tiedot. Kuten näet, stat()-funktion avulla voit saada useita hyödyllisiä tietoja tiedostosta.

Tiedoston ominaisuuksien näyttäminen ja muuttaminen

Jokaisella UNIX-perhejärjestelmän tiedostolla on kolme tärkeää ominaisuutta:

  • ryhmään kuuluminen;
  • omistaja;
  • luvat.

Kaikkia näitä ominaisuuksia voidaan muuttaa sopivilla PHP-funktioilla. Tässä osiossa kuvatut ominaisuudet eivät toimi Windows-järjestelmissä.

Jos sinulla ei ole kokemusta UNIX-käyttöjärjestelmistä, tietoja UNIX-tiedostojärjestelmän ominaisuuksista on osoitteessa http://sunsite.auc.dk/linux-newbie/FAQ2.htm. Ryhmäjäsenyyden, omistajuuden ja käyttöoikeuksien aiheita käsitellään kohdassa 3.2.6.

Funktio chgrp() yrittää muuttaa ryhmää, johon tietty tiedosto kuuluu. chgrp()-funktion syntaksi:

int chgrp (merkkijonotiedostonimi, sekaryhmä)

Filegroup()-funktio palauttaa tiedoston omistajan ryhmätunnuksen, jolla on annettu nimi tai FALSE virheen sattuessa. Filegroup()-funktion syntaksi:

int tiedostoryhmä (merkkijono tiedostonimi)

Funktio chmod() muuttaa tietynnimisen tiedoston käyttöoikeuksia. chmod()-funktion syntaksi:

int chmod (merkkijonotiedoston nimi, int-oikeudet)

Oikeudet määritellään oktaalimerkinnällä. Parametrin asettamisen yksityiskohdat chmod()-funktiolle esitetään seuraavassa esimerkissä:

chmod("data_tiedosto.txt", g+r); // Ei toimi

chmod("data_tiedosto.txt", 766); // Ei toimi

chmod("data_tiedosto.txt", 0766); // Toimii

Fileperms()-funktio palauttaa tiedoston käyttöoikeudet annetulla nimellä tai FALSE virheen sattuessa. Fileperms()-funktion syntaksi:

int fileperms (jonotiedoston nimi)

chown()-funktio yrittää vaihtaa tiedoston omistajaa. Oikeus vaihtaa tiedoston omistajaa on rajoitettu etuoikeutetulla käyttäjällä. chown()-funktion syntaksi:

int chown (jonotiedostonimi, sekakäyttäjä)

Fileowner()-funktio palauttaa käyttäjätunnuksen tiedoston omistajalle, jolla on annettu nimi. Fileowner()-funktion syntaksi:

int-tiedoston omistaja (jonotiedoston nimi)

Tiedostojen kopioiminen ja uudelleennimeäminen

Muita hyödyllisiä järjestelmätoimintoja, joita voidaan suorittaa PHP-skripteillä, ovat tiedostojen kopioiminen ja uudelleennimeäminen palvelimella. Nämä toiminnot suoritetaan kahdella funktiolla: copy() ja rename().

Tiedoston kopioiminen PHP-skriptillä ei ole vaikeampaa kuin UNIX cf -komennon käyttäminen. Ongelman ratkaisee PHP-funktio copy(). Funktion soru() syntaksi:

int-kopio (merkkijonon lähde, merkkijonon kohde)

Funktio copy() yrittää kopioida lähdetiedoston kohdetiedostoon; TOSI onnistumisesta palautetaan, FALSE epäonnistumisesta. Jos kohdetiedostoa ei ole olemassa, copy()-funktio luo sen. Seuraava esimerkki näyttää kuinka luodaan varmuuskopio tiedostosta copy()-funktiolla:

$data_file = "data.txt";

copy($data_file. $data_file.bak") or die("Ei voitu kopioida $data_file");

Rename()-funktio nimeää tiedoston uudelleen. Jos onnistuu, palautetaan TOSI, ja jos se ei onnistu, FALSE palautetaan. Rename()-funktion syntaksi:

bool uudelleennimeä (merkkijono vanha_nimi, merkkijono uusi_nimi)

Esimerkki tiedoston nimeämisestä uudelleen rename()-funktiolla:

$data_file = "data.txt";

rename($data file, $datafile.old") or die("Ei voitu nimetä uudelleen $datatiedostoa");

Tiedostojen poistaminen

Unlink()-funktio poistaa tiedoston, jolla on annettu nimi. Syntaksi:

int unlink (merkkijonotiedosto)

Jos työskentelet PHP:n kanssa Windows-järjestelmässä, saatat joskus kohdata ongelmia tämän ominaisuuden käytössä. Tässä tapauksessa voit käyttää yllä kuvattua system()-funktiota ja poistaa tiedoston DOS del -komennolla:

system("del filename.txt");

Työskentely luetteloiden kanssa

PHP-toimintojen avulla voit tarkastella ja navigoida hakemistojen sisällössä. Listaus 7.8 näyttää tyypillisen hakemistorakenteen UNIX-järjestelmässä.

Listaus 7.8. Tyypillinen hakemistorakenne

Dirname()-funktio täydentää perusnimi()-funktiota - se poimii polun täydellisestä tiedostonimestä. Dirname()-funktion syntaksi on:

merkkijono dirname (merkkijonopolku)

Esimerkki dirname():n käyttämisestä polun poimimiseen koko nimestä:

$polku = "/usr/locla/phppower/htdocs/index.php";

$tiedosto = dirname($polku); // $tiedosto = "usr/local/phppower/htdocs"

Toimintoa dirname() käytetään joskus yhdessä $SCRIPT_FILENAME-muuttujan kanssa saadakseen koko polun komentosarjaan, josta komento suoritetaan:

$dir - dirname($SCRIPT_FILENAME);

Is_dir()-funktio tarkistaa, onko tietynniminen tiedosto hakemisto:

bool is_dir (merkkijonotiedostonimi)

Seuraava esimerkki käyttää listauksen 7.8 hakemistorakennetta:

$ isdir = is_dir("indeksi.html"); // Palauttaa FALSE

$isdir = is_dir("kirja"); // Palauttaa TRUE

Funktio mkdir() tekee saman kuin samanniminen UNIX-komento, se luo uuden hakemiston. mkdir()-funktion syntaksi:

int mkdir (merkkijonopolku, int-tila)

Polku-parametri määrittää polun, jolla uusi hakemisto luodaan. Muista lopettaa parametri uuden hakemiston nimellä! Mode-parametri määrittää luodulle hakemistolle määritetyt käyttöoikeudet.

Aivan kuten fopen()-funktio avaa manipulaattorin työskentelemään tietyn tiedoston kanssa, opendir()-funktio avaa manipulaattorin työskentelemään hakemiston kanssa. Opendir()-funktion syntaksi on:

int opendir (merkkijonopolku)

suljettu()-funktio sulkee parametrina välitetyn hakemistokahvan. suljettuir()-funktion syntaksi on:

void suljettu(int directory_manipulator)

Readdir()-funktio palauttaa määritetyn hakemiston seuraavan elementin. Syntaksi:

merkkijono readdir(int directory_manipulator)

Tämän toiminnon avulla voit helposti listata kaikki nykyisessä hakemistossa olevat tiedostot ja alihakemistot:

$dh = opendir(" .);

while ($tiedosto = readdir($dh)) :

tulosta "$file
"; loppu;

Funktio chdir() toimii aivan kuten UNIX cd -komento, joka muuttuu parametrin määrittämäksi hakemistoksi. chdir()-funktion syntaksi:

int chdir (merkkijonohakemisto)

Seuraavassa esimerkissä siirrymme kirjaan/alihakemistoon ja tulostamme sen sisällön:

$newdir = "kirja";

chdir($newdir) or die("Ei voitu vaihtaa hakemistoon ($newdir)"); $dh = opendir(" . ");

while ($tiedosto = readdir($dh)) ;

tulosta "$file
";

Funktio rewlnddir() siirtää nykyisen sijainnin osoittimen opendir()-funktion avaaman hakemiston alkuun. Rewinddir()-funktion syntaksi on:

void rewinddir (int directory_manipulator)

Projekti 1: Yksinkertainen osumalaskuri

Tässä osiossa esitetty komentosarja laskee sen sivun osumien määrän, jolla se on. Ennen kuin siirryt listan 7.9 koodiin, tarkista pseudokoodilla kirjoitettu algoritmi:

  1. Anna $access-muuttujalle sen tiedoston nimi, johon laskurin arvo tallennetaan.
  2. Käytä file()-funktiota lukeaksesi $access sisällön $visits-taulukkoon. @-etuliite ennen funktion nimeä estää mahdolliset virheet (esimerkiksi annetulla nimellä ei ole tiedostoa).
  3. Aseta $current_visitors muuttuja $visits-taulukon ensimmäisen (ja ainoan) elementin arvoksi.
  4. Kasvata $current_visitors arvoa yhdellä.
  5. Avaa $access-tiedosto kirjoittamista varten ja aseta nykyisen sijainnin osoitin tiedoston alkuun.
  6. Kirjoita $current_visitors-arvo $access-tiedostoon.
  7. Sulje manipulaattori, joka viittaa $access-tiedostoon.

Listaus 7.9. Yksinkertainen osumalaskuri

// Käsikirjoitus: yksinkertainen osumalaskuri

// Tarkoitus: tallentaa tiedostoon osumien määrän

$access = "hits.txt"; // Tiedoston nimi valitaan mielivaltaisesti

$nykyiset_vieraat = $käyntiä; // Hae ensimmäinen (ja ainoa) elementti

+$nykyiset_vieraat; // Kasvata osumalaskuria

$fh = fopen($access. "w"); // Avaa hits.txt-tiedosto ja asenna

// osoitin nykyiseen sijaintiin tiedoston alussa

@fwrite($fh, $current_visitors);// Kirjoita uusi laskuriarvo

// tiedostoon "hits.txt"

fclose($fh); // Sulje tiedostonkäsittelyohjelma "hits.txt"

Projekti 2: sivustokartan rakentaminen

Listing 7.10:n komentosarja rakentaa sivustokartan, hierarkkisen näkymän kaikista palvelimella olevista kansioista ja tiedostoista alkaen tietystä hakemistosta. Sivustokartan muodostavien elementtien täyteen laskeminen käyttää tässä ja edellisissä luvuissa määriteltyjä toimintoja. Ennen kuin siirryt ohjelmaan, tarkista pseudokoodilla kirjoitettu algoritmi:

  1. Ilmoita palvelumuuttujat tallentaaksesi päähakemiston, kansion kuvan sisältävän grafiikkatiedoston nimen, sivun nimen ja palvelimen käyttöjärjestelmän lipun (Windows tai muu järjestelmä).
  2. Määritä display_directory()-funktio, joka lukee hakemiston sisällön ja muotoilee sen näytettäväksi selaimessa.
  3. Muodosta hakemistopolku yhdistämällä muuttujassa $dir1 annettu nimi ja $dir.
  4. Avaa hakemisto ja lue sen sisältö. Muotoile hakemistojen ja tiedostojen nimet ja näytä ne selaimessa.
  5. Jos nykyinen tiedosto on hakemisto, kutsu display_di rectory() rekursiivisesti ja välitä sille näytettävän uuden hakemiston nimi. Laske tulosteen muotoilussa käytetty sisennys.

Jos tiedosto ei ole hakemisto, se alustetaan näytettäväksi hyperlinkkinä (ja myös muotoilussa käytetty sisennys lasketaan).

Listaus 7.10. Sitemap.php ohjelma

// Tiedosto: sitemap.php

// Tarkoitus: sivustokartan rakentaminen

// Hakemisto, josta kartan rakentaminen alkaa

$beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// Tiedosto, jossa on kansion graafinen kuva.

// Polun on oltava Suhteellinen* Apache-palvelimen juurihakemistoon

$folder_location = "C:\Omat asiakirjat\PHP ohjelmoijille\FINAL CHPS\graphics\folder.gif";

// Teksti ikkunan otsikossa $page_name = "PHPRecipes SiteMap";

// Missä järjestelmässä komentosarjaa käytetään - Linux vai Windows?

// (0 - Windows; 1 - Linux)

$käyttäenjinux = 0;

// Funktio: display_directory

// Tarkoitus: luetaan parametrin määrittämän hakemiston sisältö

// $dir1, jota seuraa hakemiston ja tiedostohierarkian muotoilu.

// Funktiota voidaan kutsua rekursiivisesti.

funktio näyttö_hakemisto ($hakemisto1, $kansion_sijainti, $käyttäen_linuxia, $aloitussyvyys) (

// Päivitä polku

Sdh = opendir($dir);

while($tiedosto = readdir($dh)) :

// Hakemistoelementit "." ja ".." eivät tulosteta.

if (($tiedosto != ".") && ($tiedosto != "..")) :

jos ($using_linux == 0) :

$syvyys = explode("\\", $dir): muuten:

$syvyys = explode("/", $hakemisto); loppu Jos ; $curtent_depth = koko($syvyys);

// Rakenna polku käytetyn käyttöjärjestelmän sääntöjen mukaan. jos ($using_linux == 0) :

$välilehden_syvyys = $nykyinen_syvyys - $alku_syvyys;

$tiedosto = $hakemisto. "\\", $tiedosto; muu:

$tiedosto = $hakemisto. "/",$tiedosto; loppu Jos;

// Sisältääkö $tiedosto hakemiston? if (on dir($file)) :

// Laske sisennys

while ($x< ($tab_depth * 2)) :

$x++; loppuun asti;

Tulosta "

".basename($tiedosto)."
";

// Lisäyslaskuri

// Rekursiivinen kutsu display_directory()-funktioon

näyttö_hakemisto($tiedosto, $kansion_sijainti, $käyttää_linuxia, $aloitussyvyys);

// Ei hakemisto

// Rakenna polku käytetyn sääntöjen mukaan

// käyttöjärjestelmä.

jos ($using_linux == 0) :

$tab_depth = ($nykyinen_syvyys - $alku_syvyys) - 2; $x = 0;

// Laske sisennys

while ($x< (($tab_depth * 2) + 5)) :

Tulosta " ".basename($tiedosto)."
";

Tulosta " ".basename($tiedosto)."
";

loppu Jos; // Is_dir(file) endif: // Jos ! "." tai ".."

// Sulje hakemisto suljettuir($dh);

<? print "$page_name"; ?>

// Laske alkutäyttö

jos ($using_linux == 0) :

$syvyys = explode("\\", $aloituspolku);

$syvyys = explode("/", $aloituspolku);

$init_depth = koko($syvyys);

näyttöhakemisto($aloituspolku, $kansion_sijainti, $käyttäen_linuxia, $aloitussyvyys);

Kuvassa Kuva 7.1 näyttää tuloksen, kun komentosarja suoritetaan hakemistossa, joka sisältää useita tämän kirjan lukuja.

Riisi. 7.1. Hakemistorakenteen näyttäminen palvelimella sitemap.php-komentosarjan avulla

Tulokset

Tämä luku esitteli monia PHP:n työkaluja tiedostojen käsittelyyn. Pohdimme erityisesti seuraavia asioita:

  • tiedostojen olemassaolon tarkistaminen;
  • tiedostojen ja I/O-virtojen avaaminen ja sulkeminen;
  • tiedostoon kirjoittaminen ja tiedostosta lukeminen;
  • tiedoston uudelleenohjaus lähtövirtaan;
  • ulkoisten ohjelmien käynnistäminen;
  • tiedostojärjestelmän toiminnot.

Tämän luvun materiaali luo pohjan seuraavalle luvulle, "Josot ja säännölliset lausekkeet", koska verkkosovelluksia kehitettäessä merkkijonojen käsittely ja I/O-toiminnot liittyvät läheisesti toisiinsa.

Viimeisin päivitys: 1.11.2015

Kuten useimmat ohjelmointikielet, PHP tukee tiedostojen käsittelyä, jotka ovat yksi tavoista tallentaa tietoja.

Tiedostojen lukeminen ja kirjoittaminen

Tiedostojen avaaminen ja sulkeminen

Jos haluat avata tiedostoja PHP:ssä, määritetään fopen()-funktio. Sillä on seuraava määritelmä: resurssi fopen(merkkijono $tiedostonimi, merkkijono $mode) . Ensimmäinen parametri $filename edustaa tiedoston polkua ja toinen on avaustila. Avauksen tarkoituksesta ja tiedoston tyypistä riippuen tällä parametrilla voi olla seuraavat arvot:

    "r" : Tiedosto avataan vain luku -tilassa. Jos tiedostoa ei ole olemassa, palauttaa false

    "r+" : Tiedosto avataan vain luku -tilassa ja kirjoitettavana. Jos tiedostoa ei ole olemassa, palauttaa false

    "w" : Tiedosto avataan kirjoittamista varten. Jos tällainen tiedosto on jo olemassa, se korvataan, jos ei, se luodaan.

    "w+" : Tiedosto avataan kirjoitusta varten ja luettavissa. Jos tällainen tiedosto on jo olemassa, se korvataan, jos ei, se luodaan.

    "a" : Tiedosto avataan kirjoittamista varten. Jos tällainen tiedosto on jo olemassa, tiedot kirjoitetaan tiedoston loppuun ja vanhat tiedot säilyvät. Jos tiedostoa ei ole olemassa, se luodaan

    "a+" : Tiedosto avataan lukemista ja kirjoittamista varten. Jos tiedosto on jo olemassa, tiedot liitetään tiedoston loppuun. Jos tiedostoa ei ole olemassa, se luodaan

Fopen-funktion tulos on tiedostokuvaaja. Tätä kahvaa käytetään tiedostotoimintoihin ja tiedoston sulkemiseen.

Työn päätyttyä tiedosto on suljettava fclose()-funktiolla, joka ottaa parametriksi tiedostokuvaajan. Avataan ja suljetaan esimerkiksi tiedosto:

$fd = fopen("form.php", "r") or die("tiedostoa ei voitu avata"); fclose($fd);

Rakenteen or die ("virheteksti") avulla komentosarja voi pysähtyä ja näyttää virheilmoituksen, jos fopen-funktio ei pystynyt avaamaan tiedostoa.

Tiedoston lukeminen

Voit käyttää useita toimintoja tiedoston lukemiseen. Rivi-riviltä lukemiseen käytetään fgets()-funktiota, joka vastaanottaa tiedostokuvaajan ja palauttaa yhden rivin luetun. Käydään koko tiedosto läpi rivi riviltä:

Aina kun fgets():tä kutsutaan, PHP asettaa osoittimen luetun rivin loppuun. Tiedoston lopun seuraamiseen käytetään feof()-funktiota, joka palauttaa tosi, kun tiedosto on valmis. Ja kunnes tiedoston loppu on saavutettu, voimme käyttää fgets()-funktiota.

Koko tiedoston lukeminen

Tässä tapauksessa meidän ei tarvitse erikseen avata tiedostoa, hankkia kahvaa ja sitten sulkea tiedostoa.

Estä lukeminen

Voit myös lukea lohko lohkolta, eli lukea tietyn määrän tavuja tiedostosta fread()-funktiolla:

Fread()-funktiolla on kaksi parametria: luettava tiedostokahva ja luettavien tavujen määrä. Kun lohko luetaan, osoitin siirtyy tiedoston loppuun kyseisen lohkon loppuun. Ja myös käyttämällä feof()-funktiota voit seurata tiedoston valmistumista.

Kirjoita tiedosto

Voit kirjoittaa tiedoston käyttämällä fwrite()-funktiota, joka kirjoittaa tiedostoon seuraavan rivin:

Toinen fputs()-funktio toimii samalla tavalla:

Työskentely tiedostoosoittimen kanssa

Kun tiedosto avataan lukemista tai kirjoittamista varten "w"-tilassa, osoitin sijoitetaan tiedoston alkuun. Dataa lukiessaan PHP siirtää osoittimen tiedostossa luetun tietolohkon loppuun. Voimme kuitenkin myös manuaalisesti käsitellä osoitinta tiedostossa ja asettaa sen mielivaltaiseen paikkaan. Tätä varten sinun on käytettävä toimintoa fseek, jolla on seuraava virallinen määritelmä:

Int fseek (resurssi $handle , int $offset [, int $whence = SEEK_SET ])

Parametri $handle edustaa tiedostokahvaa. $offset-parametri on siirto tavuina suhteessa tiedoston alkuun, josta lukeminen/kirjoitus alkaa. Kolmas valinnainen parametri määrittää, kuinka offset asetetaan. Se voi ottaa kolme arvoa:

    SEEK_SET : oletusarvo, asettaa siirtymän offset-tavuina suhteessa tiedoston alkuun

    SEEK_CUR : asettaa siirtymän offset-tavuina suhteessa tiedoston nykyisen sijainnin alkuun

    SEEK_END : asettaa siirtymän tiedoston lopusta tavuiksi

Jos osoitin on asennettu onnistuneesti, fseek()-funktio palauttaa arvon 0, ja jos osoitin ei onnistu, se palauttaa arvon -1.

Esimerkki funktion käytöstä:

$fd = fopen("hello.txt", "w+") or die("tiedostoa ei voitu avata"); $str = "Hei maailma!"; // rivi kirjoittaaksesi fwrite($fd, $str); // kirjoita rivi alkuun fseek($fd, 0); // aseta tiedoston osoitin alkuun fwrite($fd, "Oink"); // kirjoittaa rivin alkuun fseek($fd, 0, SEEK_END); // aseta osoitin loppuun fwrite($fd, $str); // kirjoita toinen rivi loppuun fclose($fd);