Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    semafori per la memoria e per la scrittura su file

    scusate utilizzo il server web gratuito altervista e dato che sto sviluppando un portale e attualmente un forum che non fanno uso di database ma si appoggiano su semplici file di testo (alcuni anche abbastanza conosciuti utilizzano file xlm)

    Ora per quanto riguarda l'integrità dei file in scrittura con fwrite aperto con fopen e parametro a non vi sono problemi perche il file non viene cancellato e le nuove notizie vengono solo accodate.

    In questo caso non ci sono problemi in caso di richieste contemporanee in quanto puo accadere che un inserimento non vada a buon fine (fin ora a me non è ancora capitato)

    Il problema sorge quando il file viene letto (i suai valori caricati in array o variabili) poi aperto con parametro "w" che come sappiamo cancella il file per inserire il contenuto processato da php nel file in modo da modificare quanto gia inserito, ed in caso di sovrapposizione di richieste il contenuto del file può andare perduto.

    Per questo esistono i semafori in php esempio con le funzioni sem_acquire, sem_..ect

    ora se non sbaglio (nel qual caso correggetemi) su altervista ciò non è possibile.

    Quello che vi chiedo: qualcuno conosce qualche funzione, classe, trucco per sopperire a tale mancanza?

    Cioè per fare in modo che se arrivano due richieste di scrittura a file una venga messa in coda e venga processata solo che l'altra ha finito?

    Spero di essere stato chiaro

  2. #2
    giuro che on sapevo che ci fossero i semafori anche in PHP..

    ma mi sembra eccessivo usarli per i file... visto che esiste una funzioncina apposita:
    http://it.php.net/manual/it/function.flock.php



    se anche questa dovesse essere disabilitata.. beh.. è un casino.. dovresti implementarti tu un sistema di controllo.. che potrebbe prevedere l'esistenza di file d'appoggio che fungano da semafori... ovvero.. prima di scrivere su un file il tuo script potrebbe verificare se esiste un file con lo stesso nome ma estensione [ad esempio] "lck"... se esiste il file vuol dire che qualche altro processo sta scrivendo.. altrimenti crea lui il ifile e poi scrive...
    oltre ad essere macchinoso non gestisce cmq al meglio la concorrenza perchè verifica dell'esistenza del file di lock e creazione del lock stesso non sono operazioni atomiche... insomma.. se flock non funge sei nei guai.. dovresti implementarti una cosa del genere ma ancora più complessa...


  3. #3

    grazie

    infatti anche flock non funge spero che non sono nei guai ...
    Non smetto di sperare che qualcuno mi sappia indicare una classe o funzione supplente.

    il tuo suggerimento di un altro file la quale esistenza mi indica se un certo file e stato gia aperto da qualcuno non è da buttare anzi è ottima, solo non capisco
    non gestisce cmq al meglio la concorrenza perchè verifica dell'esistenza del file di lock e creazione del lock stesso non sono operazioni atomiche...
    quindi attendo sempre qualche altro suggerimento

  4. #4

    Re: grazie

    Originariamente inviato da vigilena
    infatti anche flock non funge spero che non sono nei guai ... spero sempre che qualcuno mi sappia indicare una classe o funzione supplente.
    l'unico modo è quello che ti ha detto guido, ovvero di fare un file a cui ti appoggi per verificare se un file è bloccato o meno

    magari lo controlli 2\3 volte ... e dopo che lo crei attendi qualche ad esempio qualche centesimo di secondo cosi sei certa quasi al 100% che le sovrascritture non avverranno

  5. #5

    Re: Re: grazie

    Originariamente inviato da daniele_dll
    l'unico modo è quello che ti ha detto guido, ovvero di fare un file a cui ti appoggi per verificare se un file è bloccato o meno

    magari lo controlli 2\3 volte ... e dopo che lo crei attendi qualche ad esempio qualche centesimo di secondo cosi sei certa quasi al 100% che le sovrascritture non avverranno
    Scusa allora ricapitolando:

    se devo aprire un file con fopen("indirizzo", "w");
    prima creo un file (es con estensione file.flock)
    poi faccio le mie operazioni e dopo aver chiuso con fclose
    vado a cancellare il file precedentemente creato.

    ora per impedire che qualche altra richiesta
    codice:
    fopen("indirizzo", "w");
    vada in moto mentre è attiva una contemporanea la funzione dovrebbe controllare se il file e presente e se lo è allora attendere qualche centesimo di secondo (basta?) e poi riprovare a riaprire il file...

    E' GIUSTO?

    Ma quali sono i problemi???? :master:

  6. #6
    Ciao,
    il flock viene applicato dopo l'apertura del file con parametro w, quindi il file prima viene corrotto e poi bloccato.

    La soluzione è applicare flock ad un file temporaneo esterno a quello da modificare e poi aprire il file da modificare, scrivere, rilasciare il lock sul file temporaneo

    oppure

    aprire il file da modificare in modalità r+ (che non corrompe il file), fare il lock, alla fine della scrittura fare ftruncate($puntatore, $byteScritti), rilasciare il lock
    per favore NIENTE PVT TECNICI da sconosciuti

  7. #7
    Originariamente inviato da Fabio Heller
    Ciao,
    il flock viene applicato dopo l'apertura del file con parametro w, quindi il file prima viene corrotto e poi bloccato.

    non avevo lettto.. sapevo solo che esisteva e basta.. mai usato

    aprire il file da modificare in modalità r+ (che non corrompe il file), fare il lock, alla fine della scrittura fare ftruncate($puntatore, $byteScritti), rilasciare il lock
    questa mi sembra la cosa migliore

  8. #8
    ATTENZIONE!

    Io non posso usare flock

    il mio esempio era di emulare il flock medesimo
    e non di usare la funzione flock inserita in php (non la posso usare! non funge!)

    però non ho capito:
    La soluzione è applicare flock ad un file temporaneo esterno a quello da modificare e poi aprire il file da modificare, scrivere, rilasciare il lock sul file temporaneo

  9. #9
    Originariamente inviato da vigilena
    ATTENZIONE!

    Io non posso usare flock

    il mio esempio era di emulare il flock medesimo
    e non di usare la funzione flock inserita in php (non la posso usare! non funge!)

    però non ho capito:
    credo fosse un sistema simile a quello che ti ho detto io.. se flock non va devi inventartelo tu un sistema di segnalazione e controllo..

  10. #10
    ecco come tu dici "credi" che sia un metodo simile a quello da noi descritto
    Io credo invece che si riferisse alla funzione specifica flock

    Se Fabio Heller fosse più preciso gle ne sarei grato.-

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.