C'è un modo per velocizzare il mio codice php che analizza i file XML

2

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);
                }

            }
        }
    
posta Sally 06.03.2013 - 09:45
fonte

1 risposta

4

XML non è una scelta molto buona per un database che ha bisogno di molto aggiornamento, perché i file di testo non sono ad accesso casuale: devi analizzare l'intero file ogni volta che vuoi leggere o scrivere elemento singolo. Potresti migliorare leggermente il tuo codice, ma XML non sarà veloce.

Altri problemi che potresti avere:

  • Questo si ridimensionerà molto male. Con l'aumentare delle dimensioni del tuo database, il tuo codice diventerà molto più lento.
  • Gli aggiornamenti simultanei saranno un problema. Potresti avere due persone che eseguono azioni che aggiorneranno il database allo stesso tempo? Se è così, nel migliore dei casi una azione non riuscirebbe a completarsi. Nel peggiore dei casi, potrebbe lasciare i tuoi dati in uno stato corrotto.

Suggerirei di mordere il proiettile e sostituirlo con un vero database. Sembra che abbiate ben estratto l'accesso ai dati in funzioni, quindi tutto ciò che dovete fare è riscrivere quelle funzioni per accedere a un database piuttosto che leggere e scrivere file XML.

(Conserva anche le vecchie funzioni XML per facilitare lo spostamento dei dati. Una volta scritta l'interfaccia del database, puoi creare un piccolo programma che leggerà tutti i tuoi dati in XML usando le vecchie funzioni, quindi scrivilo a il database usando le nuove funzioni.)

    
risposta data 06.03.2013 - 09:56
fonte

Leggi altre domande sui tag