7

PHP tidy 扩展有一个函数ob_tidyhandlerDocs,它与PHP 输出缓冲Docs作为回调一起使用,例如:

ob_start('ob_tidyhandler');

我知道 Tidy 有很多配置设置Docs,但是我在为该输出缓冲区回调设置默认配置选项时遇到了障碍。

大多数 Tidy 的 PHP 函数都引用了一个整洁的文档或对象,但是由于输出缓冲而无法访问该函数。

有一个配置设置tidy.default_config,但是在运行时不能更改,所以它不是很动态。

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

4

1 回答 1

10

我快速浏览了 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.

于 2012-08-02T10:27:38.600 回答