PHP ile XML Bina - akılda Performans

5 Cevap php

PHP XML oluştururken, bir dize oluşturmak için daha hızlı, daha sonra dize echo veya php verir XML işlevlerini kullanmak için? Şu anda aşağıdaki yapıyorum:

Daha iyi kod parçacığını için GÜNCEL:

$searchParam = mysql_real_escape_string($_POST['s']);
$search = new Search($searchParam);

if($search->retResult()>0){
    $xmlRes = $search->buildXML();
}
else {
    $xmlRes = '<status>no results</status>';
}

$xml = "<?xml version=\"1.0\"?>";
$xml.="<results>";
$xml.=$xmlRes;
$xml.="</results>"

header ("content-type: text/xml");
header ("content-length: ".strlen($xml));
echo($xml);


class Search {
private $num;
private $q;

function __construct($s){
    $this->q = mysql_query('select * from foo_table where name = "'.$s.'"');
    $this->num = mysql_num_rows($this->q);
}

function retResult(){
    return $this->num;
}

function buildXML(){
    $xml ='<status>success</status>';
    $xml.='<items>';
    while($row = mysql_fetch_object($this->q)){
        $xml.='<item>';
        $desTag = '<info><![CDATA[';
        foreach ($row as $key => $current){
            if($key=='fob'){
                //do something with current
                $b = mysql_query('select blah from dddd where id ='.$current);
                $a = mysql_fetch_array($b);
                $xml.='<'.$key.'>'.$a['blah'].'</'.$key.'>';
            }
            else if($key =='this' || $key=='that'){
                $desTag = ' '.$current;
            }
            else {
                $xml.='<'.$key.'>'.$current.'</'.$key.'>';
            }   
        }
        $desTag.= ']]></info>';
        $xml.=$desTag;
        $xml.='</item>';
    }
    $xml.='</items>';
    return $xml;
}

}

Xml bina daha hızlı bir yolu var mı? Ben yaklaşık 2000 öğeleri almak ve yavaşlatmak başlar ..

Şimdiden teşekkürler!

5 Cevap

Bunu birleştirerek önce metni kaçmak için hiçbir girişimde yapıyoruz görmüyorum. Hangi er ya da geç neredeyse-ama-çok değil, XML bir şey oluşturmak için gidiyoruz, ve herhangi bir uygun çözümleyici tarafından reddedilecek olan anlamına gelir.

(XMLWriter muhtemelen diğerlerinden daha ölçülebilir, ama PHP ile XML yapmadıysanız) bir kitaplığı kullanın.

Xml ayrıştırıcı kullanın. Bir dizeyi bağlamak Unutmayın, her Bitiştirmeyle ilgili tüm dizeyi tahsis etmek zorunda.

Küçük dizeleri için, dize muhtemelen daha hızlı olduğunu, ancak sizin durumunuzda kesinlikle XML işlevlerini kullanın.

Siz genellikle oldukça kötü bir fikirdir, bir döngü, içinde bir SQL sorgusu var. Her sorgu tamamlamak için yarım milisaniye alsa bile, yine de sadece bu 2000 sorguları yürütmek için ikinci bir bütün var.

Yapmanız gereken birisi bir JOIN kullanarak tek sorgu bunları açmak için nasıl size göstereceğim böylece yeni bir söz iki sorguları göndermek olduğunu.

Veritabanı şeyler genellikle mikro-optimizasyonu largely outweighs herhangi bir tür. Eğer dize birleştirme kullanmak veya birkaç bin sorguları yürütme olduğunuzda XMLWriter farketmez olsun.

(while döngüsü bitmeden echo $ xml koymak, ve uzaklaştırmak $ xml reset) her tekrarında yankı çalışın, daha hızlı olmalı

Bu kod parçacığı anlamda bir çok yapmaz, okunabilirliği için azaltılmış bazı gerçek kod gönderin.

Deftere kod daha hızlı bir sürümü olacak

$xml = '';
while ($row =  mysql_fetch_row($result))
{
    $xml .= '<items><test>' . implode('</test><test>', $row) . '</test></items>';
}

Genel olarak, kullanarak mysql_fetch_object() diğer seçenekler biraz daha yavaştır.

Belki de ne yapmaya çalışıyor böyle bir şey oldu:

$xml = '<items>';
while ($row =  mysql_fetch_assoc($result))
{
    $xml .= '<item>';
    foreach ($row as $k => $v)
    {
        $xml .= '<' . $k . '>' . htmlspecialchars($v) . '</' . $v . '>';
    }
    $xml .= '</item>';
}
$xml .= '</items>';

Başka bir yerde bahsedilmediği gibi, böyle "<" gibi özel bir karakter var asla% 100 emin değilseniz, size değerleri kaçmak zorunda ">" Veya "ve". Bu, aynı zamanda $k aslında için de geçerlidir. Senaryonun bu tür, genellikle aynı zamanda XML yerine düğüm niteliklerini kullanmak daha performanslısı.

Hedef hakkında çok az bilgi, yapabileceğimiz tüm mikro-optimize olduğunu. Belki size komut yerine ardındaki ilkeler üzerinde çalışması gerekir? Örneğin, gerçekten 2000 öğeleri oluşturmak zorunda. Eğer sonucu önbelleğe miyim, bir şey önbelleğe alabilir? Eğer sonuç, vb paginate olamaz ..

PHP'nin XML kütüphaneleri kullanma hakkında hızlı bir kelime, XMLWriter, genellikle dize manipülasyon kullanarak biraz daha yavaş olacaktır. Her şey dizeleri daha belirgin yavaş olacaktır.