PHP tidy扩展有一个函数ob_tidyhandler
Docs,它与PHP output bufferingDocs一起用作回调,例如:
ob_start('ob_tidyhandler');
我知道Tidy有a lot of configuration settingsDocs,但是我正在设置路障来为该输出缓冲区回调设置默认配置选项。
Tidy的大多数PHP函数都指的是一个整洁的文档或对象,但是输出缓冲是一个无法访问的。
有一个配置设置tidy.default_config
,但是在运行时无法更改,因此它不是很动态。
有人知道是否可以动态配置回调?我记得我自己编写了一个回调函数,收集了所有输出并通过调用tidy_repair_string
Docs来修复它,它接受配置为数组。但我认为不需要这样做并且只是将配置传递给输出缓冲区会很好。
答案 0 :(得分:10)
我已经快速查看了整洁扩展的代码,并且有一种方法可以更改输出缓冲区处理程序的配置。
那就是说,它不是漂亮的方式。它正在利用代码的一个特性,这在以后的版本中可能会有所改变。
处理缓冲区处理的函数是php_tidy_output_handler
,而line 1191上的函数调用宏TIDY_SET_DEFAULT_CONFIG
。
如果未设置tidy.default_config
,则宏不执行任何操作。如果已设置,则从磁盘读取配置文件并解析选项。
由于在解析输出缓冲区期间加载了配置文件,因此可以在解析开始之前从PHP脚本修改配置文件。
这意味着您必须制作tidy.default_config = /file/writable/by/php
并动态更新此文件以包含您需要的选项。 (我告诉过你这不是很好的方式)。
我可以立即看到这个问题。有潜在的竞争条件。
如果两个脚本需要不同的选项,并且两个脚本同时执行,则其中一个脚本可能会收到错误的配置。
该文件显然不是专门用于更改的 - 并且您可以按照扩展代码进行操作,因此没有其他可用的路径来注入配置选项,因为这些选项特定于文档。
对不起,感觉最终我只是传递了坏消息。
您最好的解决方案可能是使用自定义ob_start回调,您可以完全控制文档选项。
修改强>
有一点头脑风暴并尝试了一些事情来解决这个问题。一切都失败了。
我尝试registering a custom stream wrapper返回每个脚本值,然后设置tidy.default_config = tidy://config
。事实证明,配置加载程序无法解析流包装器,但这不起作用。
我无法正确测试的一件事是每个目录配置.user.ini
或[PATH=]
ini部分。这些都只适用于CGI / FastCGI SAPI(非FPM)。我怀疑这可能对你没有帮助。