-
Interferenza fopen() DOM
Codice PHP:
$dom=new DOMDocument();
$dom->load("file.xml");
$dom->save("file.xml");
Questo codice legge un file e lo salva. L'esecuzione non da problemi.
Codice PHP:
$fp=fopen("file.xml", "r+");
if (flock($fp, LOCK_EX)) {
$dom=new DOMDocument();
$dom->load("file.xml");
$dom->save("file.xml");
flock($fp, LOCK_UN);[/B]
} //if [/B]
fclose($fp);
Questo codice (un'interazione del precedente con fopen() e flock()) mi genera due warning:
Codice:
Warning: DOMDocument::load() [domdocument.load]: Document is empty in file
Codice:
Warning: DOMDocument::load() [domdocument.load]: Start tag expected, '<' not found in file
Inoltre dopo l'esecuzione dello script il file XML risulta completamente vuoto.
Qual'è il problema?
-
Cioè stai hai usato fopen inutilmente...
Ti consiglio di fare così:
Codice PHP:
$fp=fopen("file.xml", "r+");
if (flock($fp, LOCK_EX)) {
$xml=fread($fp, filesize("file.xml"));
$dom=new DOMDocument();
$dom->load_string($xml);
fwrite($fp, $dom->saveXML());
flock($fp, LOCK_UN);
}
fclose($fp);
Saluti!
-
siccome preferirei utilizzare load() e save() cercavo di capire qual'era il problema del codice che avevo scritto sopra, anche perchè con la tua soluzione tutto il file viene letto in una stringa e poi la stringa viene passata al documento...troppo pesante secondo me.
-
A questo punto puoi anche evitare di usare fopen (e quindi al blocco), dato che vuoi usare soltanto load e save :|
Comunque non è per niente pesante :|
Saluti!
-
Perchè? Io voglio gestire l'eventualità in cui due processi accedano contemporaneamente al file quindi mi serve fopen e anche flock.
Pesante nel senso che c'è un passaggio di variabile molto grande.