Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in ...
134217728 bytes = 128 MB,預設 memory_limit=128M(PHP 5.2+ 預設值,早期版本為 8M)。
; 找到 memory_limit 行,調大單位用 M
memory_limit = 256M
修改後重啟 PHP-FPM / Apache。
ini_set 未被禁用)<?php
ini_set('memory_limit', '256M'); // 放在腳本最開頭
// 後續耗記憶體操作...
注意:若 disable_functions 含 ini_set 則無效。
<FilesMatch "\.(php|html?)$">
php_value memory_limit 256M
</FilesMatch>
| 場景 | 優化方向 |
|---|---|
大檔案 file_get_contents/fread 一次讀全檔 | 改用串流 fopen+fread 分塊處理 |
資料庫一次 fetchAll 幾萬筆 | 游標分批 fetch、或 LIMIT 分頁 |
| 圖片處理(GD/Imagick)大圖 | 先縮圖再處理、或用 Imagick 串流 |
| 遞迴/大陣列複製 | 引用傳遞、生成器 yield、釋放未用變數 unset() |
| Composer update 記憶體不足 | COMPOSER_MEMORY_LIMIT=-1 composer update |
Allowed memory size of X bytes,換算為 MB(X/1024/1024)。php -i | grep memory_limit 實際生效值。Windows + Apache 2.2 + PHP 5.1.x 存在已知 Bug 導致 memory_limit 設定不生效,唯一解法是升級 PHP 版本或更換執行模式(改用 PHP-FPM + Nginx)。