首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 生成 XML 的三種方式效能對比:字符串拼接 vs DOMDocument vs SimpleXML

     編輯:PHP 綜合知識

前言

PHP 生成 XML 主要有三種原生方式:直接字符串拼接、DOMDocument、SimpleXML。(XMLWriter 雖高效但 API 較繁瑣,本文暫不納入。)本文通過 10,000 次循環基準測試,量化對比三者生成速度與內存佔用。

測試代碼

<?php
$data = [];
for ($i = 0; $i < 100; $i++) {
    $data[] = ['id' => $i, 'name' => "Item_$i"];
}

function directXml(array $data): string {
    $xml = '';
    foreach ($data as $d) {
        $xml .= "";
    }
    return $xml . '';
}

function domXml(array $data): string {
    $dom = new DOMDocument('1.0', 'utf-8');
    $detail = $dom->createElement('Detail');
    $dom->appendChild($detail);
    foreach ($data as $d) {
        $row = $dom->createElement('Row');
        $row->setAttribute('ID', (string)$d['id']);
        $row->setAttribute('Name', $d['name']);
        $detail->appendChild($row);
    }
    return $dom->saveXML();
}

function simpleXml(array $data): string {
    $xml = simplexml_load_string('');
    foreach ($data as $d) {
        $row = $xml->addChild('Row');
        $row->addAttribute('ID', (string)$d['id']);
        $row->addAttribute('Name', $d['name']);
    }
    return $xml->asXML();
}

$loop = 10000;
$methods = ['directXml', 'domXml', 'simpleXml'];
foreach ($methods as $method) {
    $start = microtime(true);
    for ($i = 0; $i < $loop; $i++) {
        $method($data);
    }
    $elapsed = microtime(true) - $start;
    echo "$method: ${elapsed}s\n";
}
/* 典型輸出(PHP 8.1, Linux):
directXml: 0.42s
simpleXml: 1.18s
domXml: 1.35s
*/
?>

測試結果分析

方式相對速度內存佔用代碼複雜度適用場景
字符串拼接1.0x (最快)最低低(需手動轉義)高性能、結構固定、大數據量
SimpleXML~2.8x中低(API 友好)中等數據、需讀寫修改、屬性/文本混合
DOMDocument~3.2x高(構建完整樹)高(冗長)複雜結構、需 XPath、Schema 驗證、XSLT

深度解析

1. 字符串拼接最快的原因

  • 無對象創建開銷,純內存字符串操作,PHP 內部高度優化。
  • 但需自行處理特殊字符轉義(< > & " '),否則生成無效 XML。建議封裝 xmlEscape() 輔助函數。

2. SimpleXML 次之

  • 基於 libxml2,內部仍構建樹結構,但 API 針對 PHP 優化,屬性/子節點操作直觀。
  • 生成後 asXML() 序列化有一定開銷。

3. DOMDocument 最慢

  • 標準 DOM Level 3 實現,功能最全(命名空間、Schema、XPath、文檔片段),但每個節點都是對象,創建/掛載開銷大。
  • 優勢在於「後續操作」:若需在生成後再修改、查詢、驗證,DOM 反而更高效。

最佳實踐建議

  1. 純生成、結構固定、追求極致性能:字符串拼接 + htmlspecialchars() 轉義屬性值。
  2. 需程序化構建、結構動態、後續可能修改:SimpleXML,API 最友好。
  3. 企業級集成、需 Schema 驗證、XSLT 轉換、複雜命名空間:DOMDocument。
  4. 超大 XML(百 MB 級)流式寫入:XMLWriter,唯一不佔用內存構建完整樹的方案,雖 API 繁瑣但內存常數級。

XMLWriter 速寫參考

<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('DocumentData');
$writer->startElement('Detail');
foreach ($data as $d) {
    $writer->startElement('Row');
    $writer->writeAttribute('ID', (string)$d['id']);
    $writer->writeAttribute('Name', $d['name']);
    $writer->endElement(); // Row
}
$writer->endElement(); // Detail
$writer->endElement(); // DocumentData
$writer->endDocument();
echo $writer->outputMemory();
?>

總結

「字符串拼接 > SimpleXML > DOMDocument」是生成速度排序。但選型不應只看速度:SimpleXML 兼顧開發效率與性能,是大多數業務首選;極致性能或流式場景用字符串拼接/XMLWriter;複雜文檔處理用 DOMDocument。根據業務場景權衡即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved