file_put_contents, stabieler?
Ik had een vraag over file_put_contents, of eigenlijk niet specifiek die functie maar het checken / beveiligen ervan.
Alles werkt perfect wat ik in mijn script heb staan. Maar weten jullie hoe ik het beter kan doen zodat het veiliger / stabieler is.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function schrijven()
{
$inhoud = $this->rij_kolommen . $this->rij_inhoud;
file_put_contents($this->bestand, $inhoud);
chmod($this->bestand, 0777);
}
?>
function schrijven()
{
$inhoud = $this->rij_kolommen . $this->rij_inhoud;
file_put_contents($this->bestand, $inhoud);
chmod($this->bestand, 0777);
}
?>
Ik gok dat dit stukje een onderdeel is van een script dat een database-tabel in een CSV-bestand zet. In dat geval zou ik juist niet voor file_get_contents kiezen, omdat die juist geschikt is om alles wat in het geheugen zit in één keer in een bestand te schrijven. Stel dat je een boel data in je database hebt zitten, dan moet die eerst allemaal in zijn geheel in het geheugen. Er is een redelijke kans dat dat op een gegeven moment niet meer past.
Juist hier kan je goed de "oude" functies gebruiken die naar een stream schrijven. Streams zijn trouwens relatief nieuw in PHP, maar zijn gemodelleerd op het oude fopen & fwrite systeem, juist omdat dit bestwel efficiënt is.
Je opent een maal een pointer naar een bestand, en vult het vervolgens met fwrite op. Je hoeft op zich maar een heel klein beetje in je geheugen te hebben, bijvoorbeeld 1 regel uit je db, want direct nadat je fwrite hebt aangeroepen is het klaar, en staat het in het bestand.
(op de achtergrond zijn er nog allemaal caches in je besturingssysteem, de driver en de harde schijf zelf waardoor het niet helemaal waar is, maar daar hoef je je geen zorgen om te maken.)
Één nadeel ten opzichte van file_put_contents is dat wanneer je tijdens het lezen & schrijven van de regels een fout tegenkomt, je met een half af bestand zit. Zeker wanneer je een eerder bestand vervangt met in dit geval een slechte kopie is dat vervelend. In jouw voorbeeld zou als het goed is file_put_contents dan niet eens meer aangeroepen worden, omdat dat pas de laatste stap is. Maar ook dit probleem is makkelijk te verhelpen door niet te schrijven naar het definitieve bestand, maar naar een tijdelijk bestand. Is al het schrijven dan klaar en succesvol, dan pas gooi je het oude bestand weg en verplaats (hernoem) je het nieuwe naar zijn definitieve naam.
Ik wil inderdaad uit een database gegevens halen en deze in een .csv file zetten. Inprincipe maakt het niet uit wat voor file het word. het kan ook makkelijk .txt zijn, maar in dit geval gaat het om een .csv file.
Het is inderdaad een onderdeel uit een script wat ik gemaakt heb.
Ik ben wel thuis met fopen, fwrite, fputs enzo maar file_put_contents werd door iemand aangeraden. Waarom weet ik niet dat zal ik ooit nog wel eens horen. Ik ben er mee aan de gang gegaan maar het lijkt te makkelijk om iets in een bestandje te zetten. Geen checks? Geen foutafhandeling?
file_put_contents($this->bestand, $inhoud);
Ik dacht dat er misschien wel iets was om eventuele fouten die er kunnen komen (omdat er iets niet goed is ingevoerd door een latere gebruikt) te beveiligen.
Verder zit er geen extra beveiliging in file_put_contents. Is de schijf vol tijdens het schrijven van het bestand? Dan houdt hij er mee op. De al geschreven bytes staan dan in het bestand, en dat draait hij niet terug. Hij zal dan FALSE teruggeven (als ik de broncode van PHP lees tenminste, de documentatie zegt dat hij een INT teruggeeft)
Trouwens wel handig om gewoon eens de broncode van PHP te downloaden. Dan kan je vrij gemakkelijk goed uitzoeken wat interne functies nu werkelijk doen. PHP is geschreven in alleen C, dus als je PHP snapt snap je de broncode van PHP zelf ook grotendeels wel.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Ok bedankt, dan ga ik het wel zo laten staan. Een functie maken om te kijken of er te weinig ruimte over is lijkt me dan ook wat te ver gaan. Bij het script wat ik gebruik overschrijft hij namelijk het oude bestand. Niet dat zo groot gaat worden dat je geen space meer hebt xP. Maarja................. het kan