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?
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?
Ma flock di solito si usa per scrivere.
Sinceramente non ho capito bene il tuo "problema".
Saluti!
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?
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!
con simpleXML apro il file con simplexml_load_file, senza usare fopen...no?
Come vuoi, il risultato è lo stesso, o simplexml_load_file senza fopen o simplexml_load_string con fopen.
Saluti!
e se volessi farlo con DOM?
$dom->load senza fopen o $dom->loadXML con fopen
Saluti!
si ma il mio problema è come integrare flock in tutto questo :)
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!
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?
Volevo dire proprio quello, è impossibile modificare alcune parti del file per riscriverlo tutto.
Saluti!
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?
Come ti ho detto sopra non è possibile.
Poi se vuoi ottenere il codice usi fread.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
}
Saluti!
Ma la parte in cui hai scritto //operazioni la devo fare con DOM e quindi non posso aprire il file con fopen()
Ma perchè no !
Saluti!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
}
ma in questo modo il file non viene letto due volte? una volta dalla fread() e una volta dalla loadXML()?
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!
Se uso load() posso comunque usare flock()? come?
Niente di complicatoCodice 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
}
Saluti!
Ma in questo modo il file viene letto due volte giusto?
Quindi è computazionalmente peggiore, confermi?