Programmeren in PHP/IO
Iedere programmeertaal kent zijn eigen routines voor invoer en uitvoer (Input/Output) naar bestanden, het scherm, of wat voor iets dan ook. PHP gebruikt veel functies die voor C-programmeurs erg herkenbaar zullen zijn. In dit hoofdstuk leer je hoe je bestanden opent en leest/schrijft vanuit een script. Verder leer je hoe je webpagina's kunt ophalen van andere websites via de gewone bestandsfuncties.
Invoer/Uitvoer in PHP 4
Als je webserver PHP 4 draait, lees dan dit. Als hij PHP 5 draait, raad ik je aan om file_get_contents en file_put_contents te gebruiken.
Bestanden openen
Bestanden openen in PHP is heel simpel: je gebruikt gewoon de fopen-functie:
PHP-code:
$fp = fopen("bestand.txt","r");
if($fp) {
// Je kunt hier met je bestand werken
fclose($fp);
}
else {
// Bestand kon niet worden geopend
}
Zoals je ziet geeft fopen een waarde terug in een variabele. Vanaf dat moment gebruik je $fp om het bestand te identificeren. Als je klaar bent met je bewerkingen op het bestand, moet je het netjes afsluiten met fclose. Overigens worden open bestanden bij het eindigen van je script automatisch gesloten, maar als je bijvoorbeeld 100 bestanden moet openen in je script is het wel fijn als je fclose tussendoor doet, omdat anders je resource-gebruik nogal hoog wordt.
Modes
Wat je misschien is opgevallen is de "r" als tweede parameter van fopen (de eerste parameter is de bestandsnaam). De "r" geeft aan dat we het bestand 'read only', d.w.z. alleen voor lezen willen openen. Deze letter duidt de "mode" aan. Er zijn een hele hoop modes voor fopen:
r | Alleen lezen (read only) |
w | Schrijven |
w+ | Lezen en schrijven |
a | schrijven (maar dan in 'append'-modus, wat je schrijft wordt aan het einde van het bestand toegevoegd) |
Voor de details (er zijn nog meer modes!) kijk je op de fopen-documentatiepagina.
Van een bestand lezen
De C-programmeurs onder ons gebruiken waarschijnlijk de standaard-functie fread om uit bestanden te lezen. PHP gebruikt ongeveer dezelfde functies, dus ook deze is hetzelfde. Hieronder een voorbeeldje van fread in actie:
PHP-code:
$fp = fopen("bestand.txt", "r");
$contents = "";
while (!feof($fp)) {
$contents .= fread($fp, 8192);
}
fclose($fp);
Deze code leest bestand.txt in in een loopje, steeds in brokken van 8192 bytes (de tweede parameter van fread). Met feof kun je controleren of je al aan het einde van het bestand (EOF = End Of File) zit. Overigens leest fread nooit meer in dan nodig, dus je hoeft niet bang te zijn dat als je fread($fp, 1000) doet op een bestand met maar 2 tekens dat er dan een hoop andere dingen bij komen of dat je een foutmelding krijgt. 1000 is gewoon de buffergrootte, en die buffer hoeft niet perse vol te zitten.
Een heel bestand in één keer inladen
Je kunt ook het hele bestand in 1x inladen. Niet zo slim als het bestand heel groot is, maar soms is het wel makkelijk. Je doet het als volgt:
PHP-code:
$fn = "bestand.txt";
$fp = fopen($fn,"r");
$contents = fread($fp, filesize($fn));
fclose($fp);
Heb je gelijk een nieuwe functie geleerd: met filesize vraag je de grootte van een bestand op in bytes aan de hand van de bestandsnaam. Erg straight-forward, kun je weinig fouten mee maken.
Er is echter een nog makkelijkere manier:
PHP-code:
$fn = "bestand.txt";
$contents = file_get_contents($fn);
Schrijven naar bestanden
Als je leest met fread, dan schrijf je dus logischerwijs met... fwrite, juist. fwrite is bijna net zo simpel te gebruiken als fread. Om te kunnen schrijven (write) moet het bestand wel met fopen geopend zijn in mode "w" of een andere schrijfmode:
PHP-code:
$fp = fopen("bestand.txt", "w");
if(fwrite($fp, $somecontent)===FALSE) {
echo "Kon niet schrijven!";
exit;
}
fclose($fp);
Invoer/Uitvoer in PHP 5
In PHP 5 heb je extra functies tot je beschikking wat betreft I/O:
file_put_contents
file_put_contents()
vat het bovenstaande samen. Je gebruikt het zo:
PHP-code:
$geschreven=file_put_contents('bestand.txt','Tekst...');
if($geschreven!==FALSE) {
echo "Aantal geschreven bytes: $geschreven\n";
$toegevoegd=file_put_contents('bestand.txt',"\nDit is toegevoegde tekst",FILE_APPEND);
echo $toegevoegd===FALSE ? "Niks toegevoegd" : "Aantal toegevoegde bytes: $toegevoegd";
} else {
echo "Er ging iets mis!";
}
Andere functies met bestanden
Bestanden en mappen kun je ook verwijderen, hernoemen, verplaatsen, of kopiëren. Hiervoor gebruik je deze functies:
PHP-code:
unlink("bestand.txt"); //bestand.txt verwijderen
rename("bestand.txt", "bestand.html"); //bestand.txt hernoemen naar bestand.html
move("bestand.txt", "../"); //bestand.txt naar een map omhoog verplaatsen.
copy("bestand.txt", "../"); //een kopie van bestand.txt een map omhoog maken.
rmdir("map"); //de map "map" verwijderen