Visualizzazione dei risultati da 1 a 9 su 9

Discussione: contatore su file...

  1. #1

    contatore su file...

    accessi concorrenti combinano pasticci.. giusto?
    flock funziona? avete mai fatto un contatore con flock?


  2. #2
    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

  3. #3
    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


  4. #4
    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

  5. #5
    Originariamente inviato da }gu|do[z]{®©
    hum.. macchinoso...
    è l'unico sistema ?
    in questa se vai in fondo vedi come ho gestito l'flock.

    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($fpLOCK_EX); // @ perche' in win non va

    // scrivo il nuovo numero
    fwrite($fp, ++$utenti);

    // slocko e chiudo il file
    @flock($fpLOCK_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;
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    // 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);
    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.

    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

  7. #7
    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);
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    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]
    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è..

    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


  9. #9
    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);
    Sì, per il file fantoccio è come dice Guido.

    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.