2012-07-24 47 views
7

PHP的整洁的扩展有一个功能ob_tidyhandlerDocsPHP output bufferingDocs工作作为回调,如:如何动态配置ob_tidyhandler?

ob_start('ob_tidyhandler'); 

我知道,整洁有a lot of configuration settingsDocs,但我打一个路障设置默认配置选项为输出缓冲区回电话。

Tidy的大多数PHP函数都是指整洁的文档或对象,但是输出缓冲区是不可访问的。

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

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

回答

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)。我怀疑这可能对你也没有帮助。

+1

那么,传递坏消息并非如此。从我已经预料到的文件不起作用,所以我也问了你的第二个意见,你做了很大的努力。非常感谢您花时间研究这一点。可能需要考虑寻求一种新的设置/上下文/方式来选择该回调作为功能请求,以便在运行时更好地进行控制。 – hakre 2012-08-03 07:57:54

+0

X-Ref:https://github.com/leight/php-src/commit/42ba66ff4e427a28e2e652692a4a10cec8b79df2 – hakre 2012-08-08 12:52:30