- Home
- Categorie
- Coding e Sistemistica
- PHP
- Azioni di scrittura nello stesso istante
-
Azioni di scrittura nello stesso istante
Mettiamo il caso che due o più utenti inviano un semplice form di registrazione dati nello stesso istante.
La registrazione dei dati viene eseguita in un file con i permessi di scrittura consentiti.
In questo caso può esserci una corruzione del file?
Se si è possibile risolvere in qualche modo il problema?
-
Non vorrei dire una cretinata però mysql è predisposto per avere connesioni conteporaneamente quindi non dovresti avere problemi, se invece usi file di testo come database, avresti problemi.
-
@Dartfira said:
Non vorrei dire una cretinata però mysql è predisposto per avere connesioni conteporaneamente quindi non dovresti avere problemi, se invece usi file di testo come database, avresti problemi.
E come posso risolverli?
-
Per esempio non ci potrebbe essere la possibilità di inserire una breve pausa prima di dare l'azione fwrite al server?
Cosi che se io posto in un determinato momento insieme ad un altro utente, entrambi non riceviamo lo stesso tempo di scrittura, ma con una pausa generata diversa in base al tempo e ad altre varianti.
Esiste questo?
Per esempio sleep() può essermi utile per quello che devo fare?
In alcuni esempi dove è stata usata questa funzione ho anche trovato prima di qualche riga questa:
fflush($fp);
Dove $fp è il fopen di un file con permessi di scrittura
Ho provato a vedere cosa fa il fflush() ma non ho ben capito
-
Purtoppo non so darti una risposta a questo, però ti sconsiglio di usare file di testo come database, ti conviene usare un database mysql che non ti da tutti questi problemi.
-
puoi usare flock
http://it2.php.net/manual/it/function.flock.php
per bloccare l'accesso al file mentre ci scrivi, in modo che altri non possano farlo nello stesso momento...
-
@olaola said:
puoi usare flock
http://it2.php.net/manual/it/function.flock.php
per bloccare l'accesso al file mentre ci scrivi, in modo che altri non possano farlo nello stesso momento...
Praticamente perfetto
Grazie
-
si ma se usi flock() devi poi considerare una procedura d'errore per il form, visto che solo uno degli utenti andrà a scrivere..
per evitare questi casi conviene sempre e solo il database.
-
@piccolo socrate said:
si ma se usi flock() devi poi considerare una procedura d'errore per il form, visto che solo uno degli utenti andrà a scrivere..
per evitare questi casi conviene sempre e solo il database.
E pazienza se è talmente "sfigato" da dover dare il submit nello stesso istante che lo da un altro, può anche tornare indietro e rinviare di nuovo, i dati se sono dentro un textarea o input rimangono :bho:
-
potresti usare la tecnica che avevi pensato... aspetti un tot di tempo (consiglio usleep al posto di sleep, magari in coppia con rand per generare un numero casuale di microsecondi) e poi ritenti il comando...
se va male anche la seconda e' sfiga vera!!!
-
@olaola said:
potresti usare la tecnica che avevi pensato... aspetti un tot di tempo (consiglio usleep al posto di sleep, magari in coppia con rand per generare un numero casuale di microsecondi) e poi ritenti il comando...
se va male anche la seconda e' sfiga vera!!!
Eheheh davvero
usleep() è meglio?
O altrimenti ancora meglio:
Metto sleep o usleep con microsecondi generati da un rand (), poi una volta arrivato il momento, inizia con la funzione flock() a bloccare
Cosi che se anche 100 utenti si trovano a fare submit nello stesso momento oltre ad esserci una probabilità su un migliaglio di trovarsi a scrivere nello stesso momento, e se proprio è sfiga vera allora subito dopo il primo che raggiunge si trova flock che blocca l'accesso al file ad altri o alle brutte non consente a nessuno di scrivere, cosi che comunque i dati non subiscono problemi
Flock almeno dovrebbe avere una priorità utente vero? cioè conta in microsecondi anche lui? e se capita che flock() viene eseguita praticamente nello stesso istante? avviene un blocco di richieste temporaneo al server?
-
non e' che usleep sia meglio di sleep, ma ti permette di aspettare tot microsecondi, invece che tot secondi... per velocizzare la cosa...
poi certo il controllo su flock deve rimanere... cioe' se il file e' locckato, l'operazione fallisce e devi prevedere la cosa con un "if".. nella pagina di manuale di flock il primo esempio ti spiega come gestire l'eventualita'...
-
Ho trovato una riga che volevo mostrare qui per chiedere una cosa:
[php] $filetoopen = $ub['home_path'].'forum'.$inforum.'/list.php';
$list = get_file($filetoopen);
$lst = fopen($filetoopen,'r+');
lock_file($lst);[/php]Mi stavo chiedendo ma il lock_file funziona come il flock? no perchè in rete la funzione lock_file non la trovo da nessuna parte.Ciauz.
-
Ciao KevinDavidMitnick e benvenuto nel Forum GT,
probabilmente la funzione che tu citi è stata creata dall'utente che ha scritto quel codice, per questo non la trovi in rete.
Comunque dovrebbe essere riportata nella stessa pagina dove hai preso il pezzo di codice.
-
Edit:
- Inizia i messaggi con una maiuscola e termina con un punto.
- non sono tollerati flame e polemiche.