accessi concorrenti combinano pasticci.. giusto?
flock funziona? avete mai fatto un contatore con flock?
accessi concorrenti combinano pasticci.. giusto?
flock funziona? avete mai fatto un contatore con flock?
Ciao Guido,
con flock sei al sicuro solo se fai così
se usi apertura w+
1) apri un altro file fantoccio
2) lock del file fantoccio
3) apertura del file reale
4) lettura file reale
5) somma
6) scrittura file reale
7) chiusura file reale
8) unlock file fantoccio
9) chiusura fantoccio
Questo perchè 'w' cancella il contenuto del file prima del lock
se usi apertura r+ invece puoi fare così
1) apertura del file reale
2) lock del file reale
3) lettura file reale
4) somma
5) reset posizione puntatore
6) scrittura file reale
7) unlock file reale
8) chiusura file reale
questo perchè r+ non elimina il contenuto prima del lock
per favore NIENTE PVT TECNICI da sconosciuti
hum.. macchinoso...
è l'unico sistema sicuro (è sicuro sì? ) per fare un contatore su file? Cobviene farlo così o appoggiarsi ad un bel db e farla finita?
ciao fabione
Dipende dagli accessi contemporanei possibili, se il contatore lo fai su file e ci sono moltissimi accessi contemporanei devono mettersi tutti in coda.
Ma per un semplice contatore il file va benissimo
per favore NIENTE PVT TECNICI da sconosciuti
in questa se vai in fondo vedi come ho gestito l'flock.Originariamente inviato da }gu|do[z]{®©
hum.. macchinoso...
è l'unico sistema ?
vero quello che dice Fabio sulla w ma il file fantoccio secondo me e' superfluo.
In pratica:
Codice PHP:
// vecchio numero di utenti
$utenti = file_get_contents('contatore.txt');
// apro e locko il file
$fp = fopen('contatore.txt', 'w');
@flock($fp, LOCK_EX); // @ perche' in win non va
// scrivo il nuovo numero
fwrite($fp, ++$utenti);
// slocko e chiudo il file
@flock($fp, LOCK_UN);
fclose($fp);
aggiungi magari un if((int)$utenti >= 1) prima dell' apertura in w e vai tranquillo che al massimo perdi una passata, ma non il contenuto
[edit]
ok, faccio esempio
codice:$contatore = 'contatore.txt'; // file $utenti = file_get_contents($contatore);// leggo if((int)$utenti >= 1) { // non e' gia' aperto ? $fp = fopen($contatore, 'w'); // apro e cancello @flock($fp, LOCK_EX); // locko fwrite($fp, ++$utenti); // scrivo @flock($fp, LOCK_UN); // slocko fclose($fp); // chiudo }
[ edit2 la vendetta ]
codice:// funzione ricorsiva, al massimo aspetta ... function contatore($contatore) { if(($utenti = (int)file_get_contents($contatore)) >= 1) { $fp = fopen($contatore, 'w'); @flock($fp, LOCK_EX); fwrite($fp, ++$utenti); @flock($fp, LOCK_UN); fclose($fp); } else $utenti = contatore($contatore); return $utenti; }
Però Andrea quell'IF è indispensabile perchè se il file_get_contents viene fatto subito dopo che il file è stato aperto da qualcun altro con "w" ti restituisce un risultato vuoto.// vecchio numero di utenti
$utenti = file_get_contents('contatore.txt');
// apro e locko il file
$fp = fopen('contatore.txt', 'w');
@flock($fp, LOCK_EX); // @ perche' in win non va
// scrivo il nuovo numero
fwrite($fp, ++$utenti);
// slocko e chiudo il file
@flock($fp, LOCK_UN);
fclose($fp);
Quindi secondo me tanto vale usare il file fantoccio (oppure r+), perchè al massimo saranno 3 di riche di codice in più
per favore NIENTE PVT TECNICI da sconosciuti
scusa ma non va in rischi odi doppia apertura anche il file fantoccio ?
forse non ho capito cosa intendi per file fantoccio ... cioe' alla fine quando apri in w corri sempre quel rischio .
SQLITE fa un file journal che credo sia il tuo simil fantoccio, ma continuo a non capire dove sta' la sicurezza :master:
[edit]
cmq penso tu abbia ragione, tanto per cambiare
questa come la vedi ?
codice:$contatore = 'contatore.txt'; $utenti = 1 + file_get_contents($contatore); $fp = fopen($contatore, 'r+'); @flock($fp, LOCK_EX); rewind($fp); fwrite($fp, $utenti); @flock($fp, LOCK_UN); fclose($fp);
il file fantoccio è un file vuoto ch serve solamente per accodare i processi in attesa... serve tippo semaforo per l'accesso alla sezione critica... sì alla fine è meno macchinoso quello di quello che stai dicendo tu andrè..Originariamente inviato da andr3a
forse non ho capito cosa intendi per file fantoccio ... cioe' alla fine quando apri in w corri sempre quel rischio .
[/code]
almeno a colpo d'occhio.. poi vedo meglio quando passo a programmare il tutto.. mo' vo' di fretta
grazie a tutti cmq.. è semopre bello alzare la gonna al php assieme a voi e guardargli le sue parti più segrete
Sì, per il file fantoccio è come dice Guido.Originariamente inviato da andr3a
questa come la vedi ?
codice:$contatore = 'contatore.txt'; $utenti = 1 + file_get_contents($contatore); $fp = fopen($contatore, 'r+'); @flock($fp, LOCK_EX); rewind($fp); fwrite($fp, $utenti); @flock($fp, LOCK_UN); fclose($fp);
L'esempio qui sopra, con r+, va benissimo però il rewind serve solo se prima leggi e poi vuoi scrivere.
per favore NIENTE PVT TECNICI da sconosciuti