Создание XML с помощью PHP - производительность - PullRequest
3 голосов
/ 15 апреля 2010

При сборке XML в PHP, быстрее ли построить строку, затем вывести ее на экран или использовать функции XML, которые дает вам php? В настоящее время я делаю следующее:

ОБНОВЛЕНО до лучшего фрагмента кода:

$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? Я получаю около 2000 предметов, и он начинает замедляться ..

Заранее спасибо!

Ответы [ 5 ]

6 голосов
/ 15 апреля 2010

Используйте анализатор xml. Помните, что когда вы объединяете строку, вы должны перераспределять ВЕСЬ СТРОКУ при каждом объединении.

Для небольших строк, строка, вероятно, быстрее, но в вашем случае обязательно используйте функции XML.

2 голосов
/ 15 апреля 2010

Не вижу, чтобы вы не пытались скрыть текст до его объединения. Это означает, что рано или поздно вы сгенерируете что-то, что почти, но не совсем XML, и которое будет отклонено любым соответствующим анализатором.

Использование библиотеки ( XMLWriter , вероятно, более производительный, чем другие, но я не делал XML с PHP).

1 голос
/ 16 апреля 2010

У вас есть SQL-запрос внутри цикла, что, как правило, довольно плохая идея. Даже если на выполнение каждого запроса уходит полмисекунды, выполнение этих 2000 запросов занимает целую секунду.

Вам нужно опубликовать два запроса в новом вопросе, чтобы кто-то мог показать вам, как превратить их в один запрос с помощью JOIN.

База данных обычно в значительной степени перевешивает любой вид микрооптимизации. Используете ли вы конкатенацию строк или XMLWriter, не имеет значения, когда вы выполняете несколько тысяч запросов.

0 голосов
/ 15 апреля 2010

Этот фрагмент кода не имеет большого смысла, пожалуйста, опубликуйте некоторый реальный код, уменьшенный для удобства чтения.

Более быстрая версия кода, который вы разместили, будет

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

Как правило, использование mysql_fetch_object() немного медленнее, чем другие параметры.

Возможно, вы пытались сделать что-то вроде этого:

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

Как упоминалось в другом месте, вы должны избегать значений, если вы не уверены на 100%, что никогда не будет никаких специальных символов, таких как "<" ">" или "&". Это также относится к $k на самом деле. В сценариях такого типа обычно более эффективно использовать атрибуты XML вместо узлов.

Имея так мало информации о вашей цели, все, что мы можем сделать, это микрооптимизировать. Возможно, вам следует поработать над принципами, лежащими в основе вашего сценария? Например, вам действительно нужно сгенерировать 2000 предметов. Можете ли вы кешировать результат, вы можете кешировать что-нибудь? Разве вы не можете разбить результат на страницы и т.д. ...

Быстрое слово об использовании PHP-библиотек XML, XMLWriter обычно будет немного медленнее, чем при работе со строками. Все остальное будет заметно медленнее, чем строки.

0 голосов
/ 15 апреля 2010

попытаться повторить в каждой итерации (положить echo $ xml до окончания цикла while и сбросить $ xml в начале), должно быть быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...