Visualizzazione risultati 1 fino 21 di 21

Discussione: flock() e DOM

  1. #1
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito flock() e DOM

    Vorrei interagire con un file XML attraverso un'applicazione PHP.
    Tuttavia prima vorrei accertarmi che il file non sia utilizzato da altre applicazioni e tal caso riservarlo all'applicazione in questione attraverso la flock().
    Come posso fare?

  2. #2
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Ma flock di solito si usa per scrivere.
    Sinceramente non ho capito bene il tuo "problema".

    Saluti!

  3. #3
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Esatto!
    Supponiamo che due utenti cerchino contemporaneamente di modificare un file xml.
    Dovrei gestire la cosa con flock giusto? Come faccio a usare flock con le funzioni di apertura file di DOM anzichè con la fopen?

  4. #4
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Ma devi usare per forza fopen.
    Con dom usi la funzione saveXML (con simplexml asXML) per ottenere il codice xml poi crei un blocco, salvi e rilasci il blocco.

    Saluti!

  5. #5
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    con simpleXML apro il file con simplexml_load_file, senza usare fopen...no?

  6. #6
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Come vuoi, il risultato è lo stesso, o simplexml_load_file senza fopen o simplexml_load_string con fopen.

    Saluti!

  7. #7
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    e se volessi farlo con DOM?

  8. #8
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    $dom->load senza fopen o $dom->loadXML con fopen

    Saluti!

  9. #9
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    si ma il mio problema è come integrare flock in tutto questo :)

  10. #10
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Ma io ancora non ho capito il problema, comunque con dom, simplexml e sax è inutile usare flock dato che qualsiasi modifica viene applicata a tutto il documento (XML).
    E quindi dovrai riscrivere il documento e non aggiungendo dati poco alla volta.
    Flock serve per aggiungere dati (concatenare) (vedi fopen("", "a") o file_put_contents + file_append).
    Quindi tutto questo ragionamento è inutile.

    Saluti!

  11. #11
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Innanzitutto da quanto mi risulta flock serve a riservare il file ad un solo script per impedire che due script ci accedano contemporaneamente.

    Punto secondo: è possibile anche modificare solo alcune parti del file senza riscriverlo del tutto?

  12. #12
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Volevo dire proprio quello, è impossibile modificare alcune parti del file per riscriverlo tutto.

    Saluti!

  13. #13
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Non per riscriverlo tutto.
    Se ad esempio devo aggiungere un nodo devo per forza riscriverlo tutto?

    E comunque la domanda originale era: prima di modificarlo con DOM come lo locko?

  14. #14
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Come ti ho detto sopra non è possibile.

    Codice PHP:
    $fp = fopen("file.xml", "r+"); // reading + writing.

    if(flock($fp, LOCK_EX)) {
    // operazioni
    flock($fp, LOCK_UN); // rimuovo il lock
    } else {
    // file già bloccato
    }
    Poi se vuoi ottenere il codice usi fread.

    Saluti!

  15. #15
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Ma la parte in cui hai scritto //operazioni la devo fare con DOM e quindi non posso aprire il file con fopen()

  16. #16
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Ma perchè no !
    Codice PHP:
    $fp = fopen("file.xml", "r+"); // reading + writing.

    if(flock($fp, LOCK_EX)) {
    $xml = fread($fp, filesize("file.xml"));
    $doc = new DOMDocument();
    $doc->loadXML($xml);
    // operazioni
    // finite le varie operazioni salvo il file.
    fwrite($fp, $doc->saveXML());
    flock($fp, LOCK_UN); // rimuovo il lock
    } else {
    // file già bloccato
    }
    Saluti!

  17. #17
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    ma in questo modo il file non viene letto due volte? una volta dalla fread() e una volta dalla loadXML()?

  18. #18
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    DOMDocument::loadXML() accetta come argomento una stringa. Se vuoi aprire direttamente un file senza fread puoi farlo con DOMDocument::load().
    Io ho usato loadXML perchè ho aperto il file in r+ se vuoi usare load basta soltanto aprire il file in w.

    Saluti!

  19. #19
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Se uso load() posso comunque usare flock()? come?

  20. #20
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Codice PHP:
    $fp = fopen("file.xml", "w"); // writing.

    if(flock($fp, LOCK_EX)) {
    $doc = new DOMDocument();
    $doc->load("file.xml");
    // operazioni
    // finite le varie operazioni salvo il file.
    fwrite($fp, $doc->saveXML());
    flock($fp, LOCK_UN); // rimuovo il lock
    } else {
    // file già bloccato
    }
    Niente di complicato
    Saluti!

  21. #21
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Ma in questo modo il file viene letto due volte giusto?
    Quindi è computazionalmente peggiore, confermi?

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •