具有讽刺意味的是,PHP HTML Tidy不会自己整理

我学习了HTML和开放可读源代码的价值,通过查看当时的网站资源,我仍然重视这些东西。的接口整洁的HTML图书馆(libtidy),用于整理HTML文档并美化打印其源代码。然而,每次我试图使用它时,我不得不禁用它,因为它开始吞噬PHP处理的每个文件,甚至那些它从未被告知整理的文件。我终于花时间弄明白了问题出在哪里。

HTML Tidy库应该作为一个后期处理工具来帮助发现格式化问题,美化源HTML以提高可读性。该工具在处理HTML时表现出色,但不能用于处理其他标记语言。

PHP Tidy包含一个处理回调函数的输出缓冲区ob_tidyhandler您可以在HTML文档的顶部注册,让HTML Tidy在将当前文档返回给客户端之前对其执行后处理。由于PHP Tidy中的一个bug,为一个文档注册回调将导致由同一个PHP处理器处理的每个后续请求也通过HTML Tidy运行。这将是对PHP返回的任何XML或二进制文件的破坏性操作。

问题的核心是管理和滥用全局开/关开关,以在所有文档上启用HTML整洁处理。如果您启用tidy.clean_output选项,那么通过PHP处理器的每个请求都将得到整理;甚至不支持的文件格式。这种选择应该停止并避免。

然而,ob_tidyhandler函数没有像预期的那样处理缓冲区。相反,它颠覆了全球tidy.clean_output使PHP Tidy将整个文档(而不仅仅是函数要处理的缓冲区)发送给HTML Tidy进行后期处理。这种行为与记录函数的方式完全不匹配。

在过去,web服务器会为每个请求启动PHP处理器,并在完成任务后将其搁置,这种小欺骗可能很好,它符合大多数开发人员希望使用该函数的方式。如今,相同的PHP处理器实例对成百上千的请求重用相同的运行时。

这是一个长期存在的问题,我相信在过去的十年里,我已经在网络上观察到由他的漏洞引起的问题。具体地说,我多次遇到返回Atom联合提要(XML文件格式)的服务器,这些提要被分割成一个破碎的HTML文档< meta name =“发电机”内容=“libtidy”>靠近顶部的元素。重新加载URL十多次通常会如预期的那样返回Atom格式的提要。

我的建议很明确:不要使用ob_tidyhandler!

如果你对这个问题感兴趣,可以关注yabo亚博体育下载PHP错误# 77594

来源

  • ext /整理/ tidy.c,提交91 ef4124e5,, PHP项目库,GitHub
  • ob_tidyhandler,、Tidy、其他基本扩展、PHP函数参考、PHP手册、PHP组