XML 結構清晰、支持屬性與命名空間、可通過 XSD 驗證,適合表達複雜的層級配置。PHP 提供多種解析方式,開發者可根據性能與功能需求選擇。
| 擴展/類 | 類型 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|---|
| SimpleXML | 樹模型 | 中小型配置,頻繁讀取 | API 簡潔,支持 XPath | 需載入整個文檔到內存 |
| DOMDocument | 樹模型 | 需修改/寫入 XML | 功能完整,符合 W3C 標準 | 內存佔用大,API 冗長 |
| XMLReader | 流式拉取 | 大型文件,單次遍歷 | 內存效率極高 | 只能順向讀寫,邏輯較複雜 |
| XMLParser (SAX) | 流式推送 | 超大文件,事件驅動 | 最低內存佔用 | 回調嵌套深,維護困難 |
<?php
// config.xml
// <app>
// <database host="localhost" port="3306">
// <name>myapp</name>
// <user>admin</user>
// <pass>secret</pass>
// </database>
// <cache enabled="true">redis</cache>
// </app>
$xml = simplexml_load_file('config.xml');
$db = $xml->database;
$config = [
'host' => (string)$db['host'],
'port' => (int)$db['port'],
'name' => (string)$db->name,
'user' => (string)$db->user,
'pass' => (string)$db->pass,
'cache' => [
'enabled' => (bool)$xml->cache['enabled'],
'driver' => (string)$xml->cache
]
];
// 使用 XPath 查找
$nodes = $xml->xpath('//database[@host="localhost"]');
?>
生產環境建議將解析後的配置數組緩存到 APCu/Redis,並通過文件修改時間(filemtime)或 inotify 實現熱更新,避免每次請求解析 XML。
libxml_disable_entity_loader(true); 防止 XXE 攻擊。合理選擇解析器並配合緩存策略,能讓 PHP 處理 XML 配置既優雅又高效。