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 |
< > & " '),否則生成無效 XML。建議封裝 xmlEscape() 輔助函數。asXML() 序列化有一定開銷。htmlspecialchars() 轉義屬性值。<?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。根據業務場景權衡即可。