遇到 Fatal error: Allowed memory size of 1073741824 bytes exhausted 且堆疊指向 ThinkTemplate.class.php line 265 時,單純調大 memory_limit 屬於治標不治本。本文揭露真兇:模板標籤無限遞迴,並提供精準排查與修復步驟。
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 523800 bytes) in /var/www/ThinkPHP/Lib/Template/ThinkTemplate.class.php on line 265
關鍵特徵:
ThinkPHP 模板引擎解析 <include>、<volist>、<if> 等標籤時,若模板檔案之間形成循環引用(A include B,B include A),或標籤邏輯導致無限遞迴,解析器會持續建立 AST 節點直到記憶體耗盡。
<include>、<if>、<empty> 等),重新整理頁面,找出導致錯誤的特定標籤<volist> 空陣列、<switch> 缺少 default 等邏輯缺陷也可能觸發異常行為找到問題標籤後,將其替換為 <php> 原生語法,繞過模板引擎解析:
<!-- 原有問題:include 造成循環引用 --> <include file="./Public/home/js/Company/companyJS.html" /> <!-- 修復:使用原生 PHP include --> <php>include './Public/home/js/Company/companyJS.html';</php>
<!-- 原有問題:empty 標籤異常 -->
<empty name="a">a 為空</empty>
<!-- 修復:原生 PHP 寫法 -->
<php>
if (empty($a)) {
echo 'a 為空';
}
</php>
'TMPL_CACHE_ON' => true 減少重複解析記住:模板引擎的便利性不應成為效能黑洞的藉口,善用原生 PHP 解決複雜邏輯才是正道。