problema flock

  • Creatore Discussione Creatore Discussione Marcick
  • Data di inizio Data di inizio

Marcick

Nuovo Utente
11 Gen 2013
10
0
0
Buongiorno a tutti, ho un piccolo problema con l'utilizzo di flock:

Ho due script php, il primo si occupa di ricevere delle stringhe e appenderle in un file. Il secondo riceve delle richieste di lettura del file, invia come risposta il suo contenuto e dopodichè elimina il file.
Per evitare collisioni utilizzo la funzione flock in entrambi gli script.
Copio e incollo il codice del secondo script per spiegare il problema. I commenti dovrebbero essere chiari.

PHP:
<?php

    $fid = fopen($filename, "r");
    flock($fid, LOCK_EX);                                // blocco il file in modo che il primo script vuole appendere dei dati, rimane in coda e attende.
    $file = fread($fid, filesize($filename));
    echo $file;                                              // invio come risposta il contenuto del file
    
    // ora che tutti i dati sono stati letti dal client, devo cancellare il file 
    // in modo che la prossima volta che viene chiamato questo script non vi siano dati da inviare nuovamente

    flock($fid, LOCK_UN);   //  ma per cancellare il file devo prima rimuovere il blocco
    fclose( $fid );                                             
                       
    // a questo punto il file è sbloccato e il primo script che era in coda appende una nuova stringa
    
    unlink($filename);         //cancello il file e purtroppo perdo la nuova stringa che è stata appesa dal primo script
    
    // per evitare questo problema dovrei potere cancellare il file prima di sbloccarlo, in modo che il primo script, invece di appendere la stringa
    // al file corrente ne crea uno nuovo e non perdo nessun dato
    
 ?>
 
Ultima modifica di un moderatore:
Puoi eliminare il file se il testo non è cambiato
PHP:
    if(file_get_contents($filename)==$file)
            unlink($filename);

Ma sono delle collisioni quasi impossibili da avere simultaneamente
 
sto ragionando sul suggerimento ma non so comunque come comportarmi se trovo il file di dimensioni diverse (se evito la cancellazione alla prossima interrogazione mi troverò a scaricare di nuovo gli stessi dati).
Le possibilità di collisioni sono concrete. A regime ci saranno centinaia di utenti (che poi sono dispositivi elettronici) che accederanno agli script di lettura o scrittura ciascuno a intervalli di 15 secondi.
Il modo sicuro sarebbe di potere cancellare il file prima di sbloccarlo, ma non si può. O almeno pulire tutto il suo contenuto. Se apro il file in lettura/scrittura e dopo averlo letto lo pulisco in modo che quando lo chiudo abbia dimensione 0 ? Anche così funzionerebbe bene.
Con quale codice posso svuotare il file ?
Marco
 
ciao
forse dico una putt..ata, ma dove scrivi il file non potresti fare una cosa del genere
PHP:
<?php
//......
//fino a che il file esiste continua a ciclare e quindi non inserisce
while(file_ exists($file)){
	//attesa
	sleep(5);//o altro tempo
}
// scrivi il file
?>
cioè se il file non esiste viene scritto e quindi a quel punto esiste e quindi, quando chimi lo script di scrittura, non esci dal while e "l'utente" non puo quindi scrivere.
appena il file viene letto e quindi eliminato il while si interrompe e quindi il file ricreato, ecc...
se ho detto una putt..ata (mi capita spesso) fai finta che non abbia postato
 
no, ti ringrazio comunque per l'intervento, ma così non funziona....
Lo script di scrittura deve potere in qualunque momento appendere delle nuove stringhe. Se il file non esiste lo crea, se esiste lo apre e appende.
Quando poi viene chiamato lo script di lettura, troverà dentro un numero x di stringhe, le scarica, cancella o pulisce il file (altrimenti ogni volta riscarica gli stessi dati).
Ma in quel lasso di tempo tra quando ha finito di leggere e quando il file viene cancellato, lo script di scrittura non deve potere aggiungere nulla, altrimenti il dato viene perso.
Marco
 
Credo di avere risolto:
lo script di lettura apre il file in modalità r+ e una volta trasmesso il contenuto, invece di eliminare il file lo pulisce con un ftruncate($handle,0), operazione che è possibile fare prima del file unlock.

Quando parte lo script di scrittura, trova un file vuoto e inizia ad appenderci i dati.
Mi pare che funzioni ...
Marco
 

Discussioni simili