phpenv 不直接启用 tidy 扩展,需编译 php 时添加 --with-tidy 参数并确保系统已安装 libtidy-dev/devel;tidy.clean_output=on 易破坏非 html 输出,应保持默认 off 并显式调用函数;tidy.default_config 必须为绝对路径且格式正确;tidy 是内置扩展,不可通过 pecl 安装。

phpenv 本身不直接“开启”扩展,它只负责管理 PHP 版本;tidy 扩展是否可用,取决于你编译安装该 PHP 版本时是否启用了 --with-tidy,以及运行时是否加载了对应模块。
编译 PHP 时必须显式启用 tidy
如果你用 phpenv install 8.3.5 这类命令安装 PHP,默认不会带 tidy。因为 php-build 的默认配置里没包含 --with-tidy。
- 先确认系统已装好
libtidy-devel(CentOS/RHEL)或libtidy-dev(Ubuntu/Debian),否则 configure 阶段直接报错Cannot find libtidy - 编辑
~/.phpenv/plugins/php-build/share/php-build/default_configure_options,在末尾追加一行:--with-tidy - 重新安装目标版本:例如
phpenv install 8.3.5,此时会触发完整编译,tidy就进去了 - 验证:安装完后执行
phpenv shell 8.3.5,再跑php -m | grep tidy,有输出即成功
运行时 tidy.clean_output 不要乱开
即使 tidy 扩展已加载,tidy.clean_output = On 这个 INI 指令也极易引发问题——它会在所有输出前自动调用 tidy_repair_string(),但只适合纯 HTML 输出。
- 一旦你输出 JSON、XML、二进制流(比如
imagepng())、甚至带 UTF-8 BOM 的文本,它就可能破坏内容结构,导致前端解析失败或图片打不开 - 该配置项作用域是
INI_USER,意味着只能写在用户级 php.ini(如~/.phpenv/versions/8.3.5/etc/php.ini),不能用ini_set()动态修改 - 建议保持默认
Off,需要时显式调用函数:$clean = tidy_repair_string($html, ['output-xhtml' => true]);
tidy.default_config 路径必须可读且格式正确
如果你用 tidy_parse_file() 或传入配置数组,tidy.default_config 指向的文件若存在但语法错误(比如多了一个逗号、用了中文引号),tidy 会静默失败,不报错也不修复。
- 推荐用绝对路径配置,避免相对路径在 CLI/Web 环境下解析不一致:
tidy.default_config = "/home/user/tidy.conf" - 配置文件内容应为纯键值对,每行一项,无空格分隔符,例如:
output-xhtml: true,不是"output-xhtml": "true" - 测试配置是否生效:写个最小脚本,
var_dump(tidy_getopt(tidy_parse_string('<p>test'), 'output-xhtml'));</p>,看返回是否匹配你设的值
最常被忽略的一点:PHP 编译完成之后,tidy 就固定在那个版本的二进制里了;换版本不重装,就永远没这个扩展。别指望 pecl install tidy 能补上——它不存在,tidy 是内置扩展,不是 PECL 包。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











