如何动态配置ob_tidyhandler?

时间:2012-07-24 10:44:42

标签: php tidy output-buffering

PHP tidy扩展有一个函数ob_tidyhandlerDocs,它与PHP output bufferingDocs一起用作回调,例如:

ob_start('ob_tidyhandler');

我知道Tidy有a lot of configuration settingsDocs,但是我正在设置路障来为该输出缓冲区回调设置默认配置选项。

Tidy的大多数PHP函数都指的是一个整洁的文档或对象,但是输出缓冲是一个无法访问的。

有一个配置设置tidy.default_config,但是在运行时无法更改,因此它不是很动态。

有人知道是否可以动态配置回调?我记得我自己编写了一个回调函数,收集了所有输出并通过调用tidy_repair_stringDocs来修复它,它接受配置为数组。但我认为不需要这样做并且只是将配置传递给输出缓冲区会很好。

1 个答案:

答案 0 :(得分:10)

我已经快速查看了整洁扩展的代码,并且有一种方法可以更改输出缓冲区处理程序的配置。

那就是说,它不是漂亮的方式。它正在利用代码的一个特性,这在以后的版本中可能会有所改变。

处理缓冲区处理的函数是php_tidy_output_handler,而line 1191上的函数调用宏TIDY_SET_DEFAULT_CONFIG

如果未设置tidy.default_config,则宏不执行任何操作。如果已设置,则从磁盘读取配置文件并解析选项。

由于在解析输出缓冲区期间加载了配置文件,因此可以在解析开始之前从PHP脚本修改配置文件。

这意味着您必须制作tidy.default_config = /file/writable/by/php并动态更新此文件以包含您需要的选项。 (我告诉过你这不是很好的方式)。


我可以立即看到这个问题。有潜在的竞争条件。

如果两个脚本需要不同的选项,并且两个脚本同时执行,则其中一个脚本可能会收到错误的配置。

该文件显然不是专门用于更改的 - 并且您可以按照扩展代码进行操作,因此没有其他可用的路径来注入配置选项,因为这些选项特定于文档。

  • 创建了一个新的TidyDoc。
  • 一对配置标志设置+ default_config已加载。
  • 解析缓冲区。

对不起,感觉最终我只是传递了坏消息。

您最好的解决方案可能是使用自定义ob_start回调,您可以完全控制文档选项。

修改

有一点头脑风暴并尝试了一些事情来解决这个问题。一切都失败了。

我尝试registering a custom stream wrapper返回每个脚本值,然后设置tidy.default_config = tidy://config。事实证明,配置加载程序无法解析流包装器,但这不起作用。

我无法正确测试的一件事是每个目录配置.user.ini[PATH=] ini部分。这些都只适用于CGI / FastCGI SAPI(非FPM)。我怀疑这可能对你没有帮助。