Accesso Multiutente a file in lettura/scrittura

ridecitalia

Nuovo Utente
23 Apr 2015
7
0
0
Salve a tutti,premesso che sono un neofita,vorrei porgervi una questione:-
se creo uno script che mi
-apre in lettura un file
-mi legge il valore di una variabile
-mi incrementa (++) di una unita' questo valore
-lo aggiorna e lo chiude,
e considerando che a questo script vi può accedere una moltitudine di persone quasi contemporaneamente...
Può capitare di beccare quella frazione in cui un utente tenta di accedere al file e
questo e' ancora impegnato in una manovra di read/write(e quindi devo gestire un eccezione)?
oppure vi e' sul server un sistema (tipo pila + cache)che mi risolve a monte la mia questione???
Grazie mille e cordiali saluti a tutti
Rino
 
Si, in quei termini non è tanto fantasioso che possano verificarsi richieste concorrenti.
Ti consiglio di acquisire il lock quando scrivi il file, in questo modo eventuali altre richieste verranno messe in sospeso fino al termine dell'operazione.

PHP ti mette a disposizione gli strumenti per farlo molto semplicemente:
PHP:
file_put_contents('filename', $dati_da_scrivere, LOCK_EX);

Dimenticavo di aggiungere che il lock va acquisito anche per la lettura dei file, perché php non gestisce il controllo in modo automatico:

PHP:
$file = fopen('filename', 'r');

// acquisisci il lock
if (flock($file, LOCK_EX)) {
    // leggi il contenuto del file
    $content = fread($file, filesize('filename'));
    // rilascia il lock
    flock($file, LOCK_UN);
}

fclose($file);
 
Ultima modifica:
Accesso Multiutente alle stessa tabella di un database

Si, in quei termini non è tanto fantasioso che possano verificarsi richieste concorrenti.
Ti consiglio di acquisire il lock quando scrivi il file, in questo modo eventuali altre richieste verranno messe in sospeso fino al termine dell'operazione.

PHP ti mette a disposizione gli strumenti per farlo molto semplicemente:
PHP:
file_put_contents('filename', $dati_da_scrivere, LOCK_EX);

Dimenticavo di aggiungere che il lock va acquisito anche per la lettura dei file, perché php non gestisce il controllo in modo automatico:

PHP:
$file = fopen('filename', 'r');

// acquisisci il lock
if (flock($file, LOCK_EX)) {
    // leggi il contenuto del file
    $content = fread($file, filesize('filename'));
    // rilascia il lock
    flock($file, LOCK_UN);
}

fclose($file);

Grazie per la risposta Mr. flameseeker mi sono documentato,mi hai dato una bella risposta,ora vorrei allargare leggermente l'orizzonte e porre la stessa questione dove al posto del file ci metto una tabella di un db.Come mi devo comportare se più di un utente accede contemporaneamente alla stessa risorsa di un db e deve modificarla?

Poi volevo dei chiarimenti riguardo a questo punto:-

Dimenticavo di aggiungere che il lock va acquisito anche per la lettura dei file, perché php non gestisce il controllo in modo automatico:

Cosa intendeva dire?

-Il problema Non dovrebbe presentarsi solo e soltanto quando un utente accede alla risorsa in scrittura? quando accede in lettura deve effettuare solamente delle operazioni di visualizzazione e non di modifica e quindi teoricamente ,almeno immagino,che l'accesso in lettura da parte di più utenti contemporaneamente sia per quanto riguarda i file che dati residenti su db non generi alcun tipo di errore.....
Grazie per avermi risposto Mr .Le porgo cordiali saluti
Rino
 
Dammi anche del tu, non ti preoccupare :)

Come mi devo comportare se più di un utente accede contemporaneamente alla stessa risorsa di un db e deve modificarla?

Un database gestisce autonomamente i problemi derivanti da accessi multipli alle risorse, non devi attuare nessun tipo di misura cautelativa perché non rischi di corrompere tabelle con semplici operazioni di lettura/scrittura, pertanto le operazioni di lock che potresti effettuare su un database servono solo a mantenere coerenti i dati.


Cosa intendeva dire?

-Il problema Non dovrebbe presentarsi solo e soltanto quando un utente accede alla risorsa in scrittura?

Se la tua applicazione in nessun punto scriverà mai su file ma si limiterà sempre e solo a leggere, allora è come dici tu.
Il problema può nascere quando vengono contemporaneamente richieste una lettura da un processo e una scrittura da un altro.

Quando affermo che PHP non esegue controlli per il lock in fase di lettura, intendo dire che, nonostante cerchiamo di ottenere il lock mentre scriviamo su un file (con il flag LOCK_EX mostrato nell'esempio del file_put_contents) un eventuale processo concorrente che richiede una lettura dello stesso file ignora eventuali lock definiti.

Se invece cerchiamo di acquisire il lock anche per la lettura (il secondo esempio di codice) il discorso cambia, poiché quel lock può essere ottenuto solo se non è già stato impiegato (per esempio da una procedura di scrittura) e quindi ci permette di leggere in sicurezza il file.
 
mysql lock table write

Salve
Scusami per il ritardo dei ringraziamenti...ma mi occupo di tutt'altro e non ho avuto il tempo di farlo prima....
Nel frattempo mi stò documentando sul lock delle tabelle
su db mysql con engine myisam.
Nel mio caso particolare sto sperimentando il tutto con una tabella "accessi" contenente come record :-

(la descrizione della pagina|il link alla pagina|data_ultima_modifica|numero visite|....)

Quando un utente accede al file parte lo script php che mi deve agiornare il contatore
delle visite nella tabella accessi e lo faccio con

mysql_query("LOCK TABLES accessi WRITE");

lo script che sto cercando di realizzare dovrà inserirmi come footer della pagina il numero aggiornato delle visite alla pagina stessa
ora in teoria un mysql_query("LOCK TABLES accessi WRITE"); impedisce agli altri utenti qualsiasi tipo di accesso
alla tebella finche non rilascio il lock.
Cosa si vede ritornare un cliente che ha richiesto la pagina in oggetto, durante il lock in write di un altro utente??
come si gestisce una situazione del genere?
Grazie
Rino

Dammi anche del tu, non ti preoccupare :)



Un database gestisce autonomamente i problemi derivanti da accessi multipli alle risorse, non devi attuare nessun tipo di misura cautelativa perché non rischi di corrompere tabelle con semplici operazioni di lettura/scrittura, pertanto le operazioni di lock che potresti effettuare su un database servono solo a mantenere coerenti i dati.




Se la tua applicazione in nessun punto scriverà mai su file ma si limiterà sempre e solo a leggere, allora è come dici tu.
Il problema può nascere quando vengono contemporaneamente richieste una lettura da un processo e una scrittura da un altro.

Quando affermo che PHP non esegue controlli per il lock in fase di lettura, intendo dire che, nonostante cerchiamo di ottenere il lock mentre scriviamo su un file (con il flag LOCK_EX mostrato nell'esempio del file_put_contents) un eventuale processo concorrente che richiede una lettura dello stesso file ignora eventuali lock definiti.

Se invece cerchiamo di acquisire il lock anche per la lettura (il secondo esempio di codice) il discorso cambia, poiché quel lock può essere ottenuto solo se non è già stato impiegato (per esempio da una procedura di scrittura) e quindi ci permette di leggere in sicurezza il file.
 

Discussioni simili