如何动态配置ob_tidyhandler?

hak*_*kre 7 php tidy output-buffering

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

ob_start('ob_tidyhandler');
Run Code Online (Sandbox Code Playgroud)

我知道Tidy有很多配置设置Docs,但是我正在设置路障来为该输出缓冲区回调设置默认配置选项.

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

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

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

Lei*_*igh 10

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

那就是说,这不是一个方法.它正在利用代码的一个特性,这在以后的版本中显然可能会改变.

处理缓冲区处理的函数是php_tidy_output_handler1191行调用宏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.事实证明,配置加载程序无法解析流包装器,但这不起作用.

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