Discuz! 6.0 升級後,部分外掛(如銀行外掛)在 PHP 5.2.0+ 環境出現白屏,無錯誤訊息。經排查為模板緩存檔案過大,導致 preg_replace 觸發 PCRE 回溯/遞迴限制。
PHP 5.2 引入兩個 INI 設定限制 PCRE 引擎資源消耗:
pcre.backtrack_limit(預設 100000)pcre.recursion_limit(預設 100000)當正則處理超大字串(如大型模板緩存)超過限制,preg_replace 靜默失敗返回 NULL,導致輸出為空白頁。
在 php.ini 或執行期調大限制:
; php.ini
pcre.backtrack_limit = 1000000
pcre.recursion_limit = 1000000
或程式碼中:
ini_set('pcre.backtrack_limit', '1000000');
ini_set('pcre.recursion_limit', '1000000');
preg_replace 處理超大字串,拆分模板或改用流式處理。error_reporting(E_ALL) 及時發現 PREG_BACKTRACK_LIMIT_ERROR 等常數。if (preg_last_error() === PREG_BACKTRACK_LIMIT_ERROR) { /* 處理 */ }