Kirjoittaja: Antti Laaksonen [antti.laaksonen@mbnet.fi]
PHP-skripti suoritetaan palvelimella, minkä ansiosta sillä on pääsy myös palvelimen tiedostoihin. Tämä opas käsittelee tiedostojen lukemista ja kirjoittamista. Oppaassa tutustutaan myös pariin käyttökelpoiseen tiedostofunktioon sekä menetelmään hakemiston kaikkien tiedostojen läpikäymiseen.
Tiedoston lukeminen taulukkoon
Helppo tapa lukea tiedostosta rivejä on lukea rivit taulukkoon file-funktiolla. Funktio palauttaa taulukon, joka sisältää tiedoston rivit nollasta alkaen. Esimerkissä tiedosto testi.txt sisältää kolme riviä.
<?php
//luetaan tiedosto taulukkoon $tiedosto
$tiedosto = file("testi.txt");
//nyt:
// $tiedosto[0] = "Ensimmäinen rivi."
// $tiedosto[1] = "Toinen rivi."
// $tiedosto[2] = "Kolmas rivi."
// count($tiedosto) = 3
//tulostetaan rivit
for ($i = 0; $i < count($tiedosto); $i++) {
echo ($i + 1) . ": " . $tiedosto[$i];
}
?>
Luettava tiedosto voi olla myös toisella palvelimella. Tällöin file-funktion parametriksi annetaan tiedoston koko URL, kuten http://www.palvelin.fi/sivu.htm. Taulukon alkiot päättyvät rivinvaihtomerkkiin, mikä voi välillä tuottaa ongelmia esimerkiksi merkkijonojen vertailussa. Funktio trim poistaa ylimääräiset rivinvaihdot merkkijonon lopusta.
Tiedoston avaaminen ja sulkeminen
Jos pelkkä lukeminen taulukkoon ei riitä tai tiedostoon halutaan kirjoittaa, tiedosto on avattava fopen-funktiolla. Funktio palauttaa tiedostotunnisteen, jota käytetään myöhemmin avattuun tiedostoon liittyvien operaatioiden yhteydessä. Tiedosto voi olla, samoin kuin file-funktion kanssa, myös URL-osoite. Vastaavasti fclose sulkee avatun tiedoston.
Tiedostosta lukeminen
Jos tiedostosta halutaan lukea, se avataan tilassa "r" (read). Funktio fgets lukee seuraavan rivin tiedostosta. Funktion toinen parametri on rivin maksimipituus. Jos tiedoston rivien määrää ei tiedetä, kannattaa tarkistaa funktiolla feof ennen jokaista lukukertaa, että rivejä on vielä jäljellä.
<?php
//avataan tiedosto lukutilassa
$tt = fopen("testi.txt", "r");
//nollataan rivinumerolaskuri
$i = 0;
//luetaan rivejä, kunnes tiedosto loppuu
while (!feof($tt)) {
//luetaan seuraava rivi muuttujaan
$rivi = fgets($tt, 1024);
//tulostetaan rivi rivinumeron kanssa
echo "$i: $rivi";
//kasvatetaan laskuria
$i++;
}
//suljetaan tiedosto
fclose($tt);
?>
Tiedostoon kirjoittaminen
Jos tiedostoon halutaan kirjoittaa, se avataan tilassa "w" (write). Jos tiedostoa ei ole olemassa, se luodaan. Jos tiedosto on jo olemassa, se tyhjennetään. Tiedoston voi avata myös tilassa "a" (append), jolloin kirjoittaminen aloitetaan tiedoston lopusta ja tiedoston vanha tieto ei katoa. Tämän jälkeen tiedostoon voi kirjoittaa funktiolla fwrite.
<?php
//avataan tiedosto kirjoitustilassa
$tt = fopen("testi2.txt", "w");
//kirjoitetaan tiedostoon kolme riviä; \n tarkoittaa rivinvaihtoa
fwrite($tt, "Rivi 1\n");
fwrite($tt, "Rivi 2\n");
fwrite($tt, "Rivi 3");
//suljetaan tiedosto
fclose($tt);
?>
Tiedoston oikeudet
Unix-käyttöjärjestelmässä tiedoston oikeudet (chmod) voivat rajoittaa sen lukemista tai kirjoittamista. Sopiva chmod-arvo riippuu siitä, onko tiedostoa tarkoitus vain lukea vai pitääkö siihen pystyä myös kirjoittamaan. Virheilmoitus "Permission denied" viestii liian tiukoista oikeuksista. FTP-ohjelma sisältää tavallisesti mahdollisuuden muuttaa tiedoston oikeuksia. PHP:stä löytyy myös funktio chmod tähän tarkoitukseen.
Rivinvaihto-ongelmat
Unixeissa ja Windowseissa käytetään erilaista rivinvaihtoa. Unixin rivinvaihto on \n (ASCII 10), kun taas Windowsin rivinvaihto on \r\n (ASCII 13 + ASCII 10). Tämä voi tuottaa ongelmia silloin, kun skriptin luomaa tiedostoa yritetään lukea Windowsin tekstieditorilla: toiset editorit eivät tunnista oikein Unix-rivinvaihtoja. Yhtä kaikki PHP:lle kelpaavat molemmat tavat ilmaista rivinvaihto.
Tiedoston tiedot
PHP sisältää joukon valmiita funktioita, joiden avulla on mahdollista saada tarkempia tietoja tiedostosta. Funktiot ovat käytössä ainoastaan oman palvelimen tiedostoilla. Tässä listassa on muutamia tavallisimpia funktioita.
file_exists kertoo, onko tiedostoa olemassa.
filesize palauttaa tiedoston koon tavuina.
fileatime palauttaa ajan, jolloin tiedostoa on viimeksi käytetty.
filemtime palauttaa ajan, jolloin tiedostoa on viimeksi muokattu.
Esimerkki tarkistaa tiedoston olemassa olon ja tulostaa sen koon ja muokkausajan. Lisätietoa date-funktion käytöstä on tulossa opassarjan seuraaviin osiin.
<?php
//käsiteltävä tiedosto
$tiedosto = "testi.txt";
//jatketaan, jos tiedosto on olemassa
if (file_exists($tiedosto)) {
//luetaan tiedoston koko ja muokkausaika muuttujiin
$koko = filesize($tiedosto);
$aika = filemtime($tiedosto);
//tulostetaan tiedot
echo "Tiedoston koko on $koko tavua ja sitä on viimeksi muokattu " . date("d.m.Y", $aika). ".";
} else {
echo "Tiedostoa ei ole olemassa!";
}
?>
Hakemiston tiedostojen läpikäyminen
Hakemiston tiedostojen läpikäyminen onnistuu kolmen funktion yhteistyöllä: opendir, readdir ja closedir. Näitä funktioita tarvitaan vaikkapa silloin, kun halutaan luoda hakemistossa olevista kuvatiedostoista automaattisesti päivittyvä kuvagalleria. Aluksi kutsutaan opendir-funktiota parametrina käsiteltävä hakemisto. Tämän jälkeen readdir-funktio palauttaa aina seuraavan tiedoston hakemistossa. Lopuksi funktio closedir sulkee hakemiston.
<?php
//avataan hakemisto kuvat
$hak = opendir("kuvat/");
//luetaan ensimmäisen tiedoston nimi
$nimi = readdir($hak);
//jatketaan niin kauan kun $nimi ei ole false
while ($nimi) {
//tulostetaan tiedoston nimi
echo "$nimi\n";
//luetaan seuraavan tiedoston nimi
$nimi = readdir($hak);
}
//suljetaan hakemisto
closedir($hak);
?>
Jos opendir-funktiota kutsutaan parametrilla ".", tiedostoja etsitään siitä hakemistosta, jonne skripti on tallennettu (tai oletushakemistosta). Hakemistosta luetaan sekä tiedostot että alihakemistot: funktio is_file ilmoittaa, jos kyseessä on tiedosto ja is_dir ilmoittaa, jos kyseessä on hakemisto.
Loppusanat
Tiedostofunktiota tarvitsee usein ja niiden käytöstä tuleekin nopeasti arkipäivää PHP-ohjelmoijalle. PHP:n manuaalia kannattaa silmäillä tiedostoihin(kin) liittyvissä asioissa: se sisältää kaikkien tiedostofunktioiden kuvaukset ja myös monia hyödyllisiä esimerkkiskriptejä.
Näillä näkymin oppaita tulee vielä kaksi tai kolme. Vielä käsittelemättä olevia aiheita ovat ainakin funktiot ja luokat, merkkijono- ja päivämääräfunktiot, evästeet sekä MySQL-tietokannan käyttäminen. Seuraava opas ilmestynee parin-kolmen viikon kuluessa. osa 6
Antti Laaksonen, 24.4.2003