Sto sviluppando un'applicazione web e stiamo usando XML come database e sto usando Linux come piattaforma e centos 6.5 come server. Cambiare qualche valore farebbe un sacco di cambiamenti in circa sei file XML.
Quindi ecco il problema: premendo il pulsante salva dopo la modifica, l'aggiunta, l'eliminazione dura circa uno o uno e mezzo minuto o più! Questo perché il mio codice deve aggiornare circa sei file XML, file di registro e il file crontab. Mi chiedo se c'è qualcosa di simile ai thread in PHP?
Ho le mie funzioni e tutto il codice che voglio, voglio solo sapere come php può essere usato in un modo nuovo per migliorare le prestazioni. Puoi guidarmi anche tramite link da leggere?
Non so quale sia esattamente questo problema è chiamato per la ricerca su di esso. Sono ancora un principiante.
ecco la funzione di aggiornamento che sto utilizzando:
public static function update($tableName, $fieldsToUpdate, $newValues, $value = NULL) {
//Load XML file
$fileName = G_APP_SCRIPTS_PATH . "/XMLS/xmls/" . $tableName . ".xml";
$xml = new DOMDocument;
$xml->load($fileName);
//Load XSD file
$xsdfileName = G_APP_SCRIPTS_PATH . "/XMLS/xsds/" . $tableName . ".xsd";
$xsd = new DOMDocument;
$xsd->load($xsdfileName);
//Generate Xpath
$path = c_XML::generateXPath($xml, $xsd, $fieldsToUpdate, $value);
$xpath = new DOMXPath($xml);
//Query nodes to update
$nodes = $xpath->query($path);
// print_r($nodes->item(0));
//If number of new values < number of elements to update,means we have to update
//all specified elements in the XML without any condition
if (count($newValues) < $nodes->length) {
for ($i = 0; $i < $nodes->length / count($newValues); $i++)
$newValues = array_merge($newValues, $newValues);
}
//Iterate over the nodes to update
for ($i = 0; $i < $nodes->length; $i++) {
$oldNode = $nodes->item($i);
for ($index = 0; $index < count($fieldsToUpdate); $index++) {
//Find the associated index in the $fieldsToUpdate array
if (strcmp($oldNode->nodeName, $fieldsToUpdate[$index]) === 0) {
break;
}
}
//Create new node with the old node's name
$newNode = $xml->createElement($oldNode->nodeName);
//var_dump($newNode);
//if the new value is an array,means we have to update an inner node
if (is_array($newValues[$index])) {
//go to the desired node in XSD and get its children elements,
//to know their format
$xsdxpath = new DOMXPath($xsd);
$children = $xsdxpath->query("/xs:schema/xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:element[@name='" . $oldNode->nodeName . "']/xs:complexType/xs:sequence/xs:element");
//convert the $chlidren node list to an array to pass the createNode function.
for ($c = 0; $c < $children->length; $c++) {
$childrenArray[$c] = $children->item($c);
}
//create the desired node
c_XML::createNode($xml, $xsdxpath, $newNode, $childrenArray, $newValues[$index]);
}
//If the new value is not an array
else
$newNode->nodeValue = $newValues[$index];
//Replace old node with new node
$parent = $oldNode->parentNode;
$parent->replaceChild($newNode, $oldNode);
}
//Validate & save XML
$isValid = c_XML::validateXMLtoXSD($xml, $xsdfileName);
if ($isValid == 1) {
$xml->save($fileName);
return true;
}
else
return false;
}
e quando l'utente aggiorna un valore, io uso in questo modo per aggiornare altri file xml:
private static function change_value_in_xml_file($old_value, $new_value) {
$all_nodes = c_XML_h::select(tables::xmlfile, '*');
$nodes = array();
for ($i = 0; $i < count($all_nodes); $i++) {
$nodes[$i] = array();
//just get the nodes i want
$nodes[$i][0] = $all_nodes[$i][0];
$nodes[$i][1] = $all_nodes[$i][3];
}
//find old value and replace it with new value
foreach ($nodes as $node) {
$newValues[0] = $new_value;
if ($node[1] == $old_value) {
$id_to_update = $node[0];
$fieldsToSelect[0] = xmlfile:: value;
c_XML_h::update(tables::xmlfile, $fieldsToSelect, $newValues, $id_to_update);
}
}
}