Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Scrittura concorrente & sicura su file

    Normalmente per fare accessi concorrenti sui file si usa flock().

    Questo però presenta due problemi dal mio punto di vista.
    Il primo è quello noto, e cioè che su alcuni sistemi flock è implementato a livello di processo, quindi se il PHP gira in multithreading flock semplicemente non funge.

    Il secondo è che, se due script contemporaneamente devono aggiornare un file con le stesse informazioni, io voglio che lo faccia uno e uno solo, non entrambi uno dopo l'altro grazie all'flock, perché fare due volte le stesse cose è inutile.

    Ora, nel mio script, la scrittura sul file deve essere effettuata solo se un certo campo di un record nel database è impostato a un determinato valore.
    Quindi ho pensato lo script organizzato così:
    - faccio una SELECT FOR UPDATE sul record in questione (lock a livello di riga);
    - se il valore nel record mi dice di aggiornare il file, lo aggiorno e poi faccio l'UPDATE per aggiornare il record, altrimenti faccio un COMMIT e chiudo la transazione.

    In questo modo, suppongo, l'accesso al file dovrebbe essere sempre in mutua esclusione, gestita però dal database che fa questa cosa molto bene. Inoltre ci sarebbe una sola operazione di scrittura (la SELECT FOR UPDATE successiva troverebbe il record già aggiornato).
    Suppongo anche che in questo caso non sia nemmeno necessario usare il flock(), reso inutile dal lock sul database.

    Confermate le mie supposizioni?
    Eventuali controindicazioni di questo metodo?

  2. #2
    volevo fare un ipotesi, sicuramente stupida.
    Tu stai usando dei file e quindi mi sembra cmq anomalo appoggiarsi a un DB per sostenere questa pecca di flock che nn funge mai. A quel punto verrebbe spontaneo dirti usa sempre il database ; ma sicuramente avrai i tuoi motivi per utilizzare i file.
    Allora chiedo : e se usassi ciò che fai sul database mediante un file di testo ?
    Ovvero metti un file lock.txt nel quale ogni volta che si accede a un file lo si mette li dentro (il nome ad esempio) e si verifica se lo si sta usando(immaginando di inserirlo in quesot file quando si accede e non è presente in lock.txt)...e il discorso prosegue come il tuo su db.

  3. #3
    [supersaibal]Originariamente inviato da ellecubo
    volevo fare un ipotesi, sicuramente stupida.
    Tu stai usando dei file e quindi mi sembra cmq anomalo appoggiarsi a un DB per sostenere questa pecca di flock che nn funge mai. A quel punto verrebbe spontaneo dirti usa sempre il database ; ma sicuramente avrai i tuoi motivi per utilizzare i file.
    Allora chiedo : e se usassi ciò che fai sul database mediante un file di testo ?
    Ovvero metti un file lock.txt nel quale ogni volta che si accede a un file lo si mette li dentro (il nome ad esempio) e si verifica se lo si sta usando(immaginando di inserirlo in quesot file quando si accede e non è presente in lock.txt)...e il discorso prosegue come il tuo su db.
    [/supersaibal]
    Mi serve per un sistema di caching dei dati estratti dal DB, quindi uso sia il database che il filesystem.

    Il tuo sistema non funziona perché l'accesso al file lock.txt presenta i medesimi problemi di qualsiasi altro file ad accesso condiviso.

  4. #4
    Dio mio...preso dalla discussione...cancellate subito la mia risposta !!!

  5. #5
    uppino

    nessuno mi dice se l'idea fa schifo?
    Su, non siate timidi

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 © 2025 vBulletin Solutions, Inc. All rights reserved.