我已經快速瀏覽了整潔擴展的代碼,並且有一種方法可以更改輸出緩衝區處理程序的配置。
這就是說,它不是不錯的方式。它正在利用在未來版本中明顯可能改變的代碼特徵。
處理緩衝區處理的函數是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)。我懷疑這可能對你也沒有幫助。
那麼,傳遞壞消息並非如此。從我已經預料到的文件不起作用,所以我也問了你的第二個意見,你做了很大的努力。非常感謝您花時間研究這一點。可能需要考慮尋求一種新的設置/上下文/方式來選擇該回調作爲功能請求,以便在運行時更好地進行控制。 – hakre 2012-08-03 07:57:54
X-Ref:https://github.com/leight/php-src/commit/42ba66ff4e427a28e2e652692a4a10cec8b79df2 – hakre 2012-08-08 12:52:30