我快速浏览了 tidy 扩展的代码,并且有一种方法可以更改输出缓冲区处理程序的配置。
也就是说,这不是一个好方法。它正在利用代码的一个特性,该特性显然可能在未来的版本中发生变化。
处理缓冲区处理的函数是php_tidy_output_handler
在第 1191 行,它调用宏TIDY_SET_DEFAULT_CONFIG
。
如果tidy.default_config
未设置,则宏不执行任何操作。如果已设置,则从磁盘读取配置文件并解析选项。
由于配置文件是在解析输出缓冲区期间加载的,因此可以在解析开始之前从您的 PHP 脚本中修改配置文件。
这意味着您必须制作tidy.default_config = /file/writable/by/php
并动态更新此文件以包含您需要的选项。(我告诉过你这不是一个好方法)。
我可以立即看到这个问题。存在潜在的竞争条件。
如果两个脚本需要不同的选项,并且两个脚本同时执行,则其中一个脚本可能会收到错误的配置。
该文件显然不是为临时更改而设计的——您可能可以从扩展代码中了解到,没有其他可用的路径来注入配置选项,因为这些选项是特定于文档的。
- 创建了一个新的 TidyDoc。
- 几个配置标志集 + default_config 加载。
- 缓冲区被解析。
对不起,感觉最后我只是在传递坏消息。
您最好的解决方案可能是使用自定义 ob_start 回调,您可以完全控制文档选项。
编辑:
进行了一次头脑风暴,并尝试了一些方法来解决这个问题。一切都以失败告终。
我尝试注册一个自定义流包装器以返回每个脚本的值,并设置tidy.default_config = tidy://config
. 事实证明,配置加载器没有解析流包装器,这不起作用。
One thing I have not been able to test correctly is the per-directory configuration .user.ini
or the [PATH=]
ini section. These are both only available with the CGI/FastCGI SAPI (not FPM). I suspect this probably doesn't help you either.