2012-07-24 49 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