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
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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:

ridecitalia

Nuovo Utente
23 Apr 2015
7
0
0
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
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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.
 

ridecitalia

Nuovo Utente
23 Apr 2015
7
0
0
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
Autore Titolo Forum Risposte Data
F PROBLEMA ACCESSO INSTAGRAM Discussioni Varie 2
A Dare l'accesso ad una pagina solo ad un utente specifico PHP 0
R reindirizzamento accesso facebook Facebook 1
elpirata Gestire permessi accesso alle pagine PHP 3
A Problemi di accesso da remoto a Ipcam IP Cam e Videosorveglianza 6
R Accesso a Mit APP Inventor2 Sviluppo app per Android 0
A Limitare accesso ad alcune pagine web PHP PHP 2
gandalf1959 [PHP] Verifica password per accesso ad area riservata PHP 3
O Sricam SP 007 accesso con IP rete IP Cam e Videosorveglianza 0
B Problemi accesso Instagram Smartphone e tablet 1
C [PHP] Accesso ad un file specifico solo in base al server assegnato PHP 2
K Accesso videosorveglianza in mano ad altri IP Cam e Videosorveglianza 1
I Recupero accesso pannello di controllo dominio Leggi, Normative e Fisco 2
I [PHP] CURL per accesso ad area riservata PHP 6
M [PHP] o [APACHE] - Filtro geo per accesso sito PHP 6
F Come funziona in javascript l'accesso alle variabili dell'array Programmazione 1
E [PHP] Sso unico accesso per più siti PHP 8
J Limitare accesso disco condiviso Server Dedicati e VPS 0
G password accesso dvr IP Cam e Videosorveglianza 0
R [WordPress] Accesso al db e verifica credenziali (password criptata) WordPress 1
G Samsung tab 4 - impostazione e cancellazione codice di accesso Smartphone e tablet 0
W [ASP] Accesso a database Classic ASP 0
F IP CAM con accesso da remoto IP Cam e Videosorveglianza 1
base90 [php] phpMyAdmin nega l'accesso PHP 4
base90 [php] phpMyAdmin nega l'accesso Presentati al Forum 1
M Hosting con accesso SSH Hosting 1
P Gestire accesso ad un file xml pubblico PHP 1
Z accesso lista file directory con browser HTML e CSS 4
T Condizioni multiple in htaccess per accesso a sub folder basato su indirizzo IP Apache 0
F Accesso php PHP 9
A Corrotto accesso DB Programmazione 3
T Controllo sintassi mail per accesso dispositivi Wi-Fi Javascript 1
C accesso proibito error 403 Apache 0
L Accesso area riservata tramite QR code WordPress 3
A accesso area riservata nn funziona più PHP 1
P phpmyadmin e accesso database PHP 3
filomeni Accesso configurazione TP-LINK Reti LAN e Wireless 5
otto9due Accesso agli elementi <![CDATA[ ... ]]> di un file XML con SimpleXML e PHP PHP 2
L Transazione per accesso concorrente a una tabella MySQL 1
otto9due limitare l'accesso a cartelle e file a tutti tranne che ad alcuni domini.. PHP 1
Recover Creare database access con accesso riservato MS Access 0
C Accesso negato - error 403 PHP 0
A Problemi con accesso a MYsql MySQL 1
B Cambio webserver accesso a siti esterni Apache 0
Monital Bloccare l'accesso ad una cartella sull'ftp PHP 3
I Acquisto sito WordPress: credenziali limitate di accesso al pannello Leggi, Normative e Fisco 4
S Unificare accesso di due siti wordpress WordPress 0
I IIS8 in dominio, accesso Directory Virtuale. IIS 0
L Accesso remoto Reti LAN e Wireless 6
D Accesso riservato WordPress 6

Discussioni simili