XMLWriter 扩展在 XAMPP 中默认已编译但禁用,需在 php.ini 中取消 extension=xmlwriter 注释、确保 extension_dir 正确,并重启 Apache;启用后可通过 phpinfo() 验证并用 new XMLWriter() 生成 XML 文件。

XMLWriter 扩展在 XAMPP 中默认已编译进 PHP,但通常处于禁用状态;只需在 php.ini 中启用对应 extension 行并重启 Apache 即可生成 XML 文件。
确认 XMLWriter 是否已编译支持
XMLWriter 是 PHP 内置的 XML 生成类(非独立扩展包),依赖 libxml,XAMPP 的 PHP 版本只要 ≥ 5.1.2 就自带该类。但运行时可能报错 Class 'XMLWriter' not found,说明它没被加载。
验证方式:在 htdocs 下建一个 info.php,内容为 <?php phpinfo(); ?>,浏览器访问后搜索 xmlwriter —— 若页面中出现 “xmlwriter support ⇒ enabled”,说明已启用;若只显示 “libxml support ⇒ enabled”,则需手动开启。
在 php.ini 中启用 xmlwriter 扩展
XAMPP 的 php.ini 通常位于:D:\xampp\php\php.ini(Windows)或 /opt/lampp/etc/php.ini(Linux)。别改错文件 —— XAMPP 控制面板里点击 Apache → Config → PHP (php.ini) 可直接打开正确路径。
找到这一行(大概在 900 行附近):
;extension=xmlwriter
去掉前面的分号,改成:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
extension=xmlwriter
⚠️ 注意事项:
- 不要写成
extension=php_xmlwriter.dll(Windows)或extension=xmlwriter.so(Linux)—— XAMPP 已预编译为内置模块,直接写xmlwriter即可 - 确保
extension_dir指向正确路径,例如 Windows 下应为extension_dir = "D:\xampp\php\ext" - 如果同时启用了
extension=dom和extension=xml,建议一并保留,XMLWriter 依赖它们底层能力
测试 XMLWriter 是否可用并生成文件
启用后必须重启 Apache(XAMPP 控制面板点 Stop 再 Start),否则修改不生效。
新建 test-xml.php 放入 htdocs:
<?php
$writer = new XMLWriter();
$writer->openURI('output.xml');
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('root');
$writer->writeElement('item', 'Hello World');
$writer->endElement();
$writer->endDocument();
echo "XML written to output.xml";
?>
访问该脚本后,检查 htdocs/output.xml 是否生成。若报错 failed to open stream: Permission denied,说明 Apache 进程无写权限 —— 把文件先手动建好并设为可写,或把输出路径改为 sys_get_temp_dir() . '/output.xml' 避开权限问题。
常见失败原因与绕过技巧
即使 extension 已启用,仍可能因以下原因失败:
-
php -m | grep xml(命令行)显示xmlwriter,但网页中不生效 → 检查是否改了错误的php.ini(CLI 和 Web 使用不同配置文件) - Apache 启动后立即变灰 →
httpd -t报语法错,多半是php.ini里 extension 行末尾多了空格或中文标点 - 生成的 XML 文件为空 → 确保调用了
$writer->flush()或$writer->endDocument(),否则缓冲未写出 - 想用
XMLWriter::openMemory()→ 完全可行,但后续要用$writer->outputMemory(true)获取字符串,别漏掉参数true
真正容易被忽略的是:XAMPP 更新后会覆盖 php.ini,或者你误改了 php.ini-development 而非正在使用的那个。每次 Apache 启动失败,第一反应不该是重装,而是用 phpinfo() 页面顶部的 “Loaded Configuration File” 路径去核对。

















