PHPBlog.it

Scrittura su file: append di testa

Word.LineCapita spesso di utilizzare le funzioni di scrittura su file per salvare su filesystem dati di eventi particolari come i log di un’applicazione su cui stiamo lavorando. Immaginiamo di aver bisogno di inserire di volta in volta i dati in testa al file di log invece che in coda (nel qual caso fopen con “mode a” andrebbe più che bene), come fare?

Per prima cosa è importante leggere il manuale online di php.net riguardo alla funzione fopen dove sono ben riassunti i vari mode con il loro significato. Dopo una prima lettura parrebbe che il mode che più si addice al nostro caso sia quello ‘r+’ che apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file. Fin qui tutto bene se non fosse per il fatto che dopo un primo semplice test ci accorgeremmo di qualcosa di strano: non è un append al contrario ma una sovrascrittura per il numero di caratteri presenti nella stringa che vogliamo scrivere. Ovvero se il file contiene “Hello world!” e aggiungiamo “Ciao” il risultato finale sarà “Ciaoo world!”. Quindi “Ciao” avrà rimpiazzato “Hell”. Non è ciò che vogliamo.

Come procedere quindi? Una soluzione potrebbe essere quella di affrontare il problema in tre passi:

  1. Leggere il contenuto iniziale del file
  2. Scrivere la stringa che ci interessa
  3. Appendere il contenuto letto in precedenza

Per il punto 1 ricorriamo alla funzione file_get_contents(string $filename) che legge il contenuto di un file passato come parametro:
$string = file_get_contents($filename);

Si passa quindi al punto 2 aprendo il file in scrittura sfruttando fopen (mode w)

if (!$handle = fopen($filename, 'w')) {
echo "Non si riesce ad aprire il file ($filename)";
exit;
}

e si scrive finalmente il nuovo contenuto usando la funzione fwrite

if (!fwrite($handle, $somecontent)) {
echo "Non si riesce a scrivere nel file ($filename)";
exit;
}

Ora non resta che aprire nuovamente il file, questa volta realmente in append mode (mode a), ed inserire il contenuto letto al passo 1

if (!$handle = fopen($filename, 'a')) {
echo "Non si riesce ad aprire il file ($filename)";
exit;
}

if (!fwrite($handle, $string)) {
echo "Non si riesce a scrivere nel file ($filename)";
exit;
}

Allego come sempre lo script completo con tanto di commenti per permettervi di provare direttamente quanto proposto. Usatelo come base di partenza per le vostre prove, in caso di dubbi chiedete pure spiegazioni qui sotto nei commenti.

CREDITS
Word.Line di apesara rilasciata sotto licenza Creative Commons “Attribuzione 2.0 Generico

Pubblicato da il 5 giugno 2008 in phpblog, , ,

Commenti

  • Questo articolo è stato segnalato su ZicZac.it….

  • upnews.it scrive:

    Scrittura su file: append di testa…

    Capita spesso di utilizzare le funzioni di scrittura su file per salvare su filesystem dati di eventi particolari come i log di un’applicazione su cui stiamo lavorando. Immaginiamo di aver bisogno di inserire di volta in volta i dati in testa al file…

  • diggita.it scrive:

    Scrittura su file: append di testa…

    Capita spesso di utilizzare le funzioni di scrittura su file per salvare su filesystem dati di eventi particolari come i log di un’applicazione su cui stiamo lavorando. Immaginiamo di aver bisogno di inserire di volta in volta i dati in testa al file…

  • Matteo scrive:

    C’è però da considerare il problema delle prestazioni all’aumentare delle dimensioni del file. Una scrittura di questo tipo impiegherà un tempo proporzionale alla dimensione dei dati da scrivere più la dimensione iniziale del file. Anzi, a occhio direi il doppio della dimensione iniziale visto che va prima letto e poi scritto.

    Bisogna poi considerare, sempre quando il file è grosso, l’uso di RAM derivante dal fatto di inserire tutto il contenuto in una variabile.

  • Daniel Londero scrive:

    @Matteo
    Sicuramente questo è un aspetto da non sottovalutare e tenere in considerazione in funzione delle proprie esigenze e della mole di dati da gestire.
    Di sicuro il classico append è studiato appositamente per queste situazioni.

  • Lascia un Commento

    *