PHP「Not enough Memory」實戰排錯筆記

目錄

PHP「Not enough Memory」實戰排錯筆記

1. 背景

2. 快速定位

3. 為什么 5 MB 的圖片能耗盡 128 MB?

3.1 粗略估算公式(GD)

4. 實際峰值監控

5. 解決過程

6. 最佳實踐與防御措施

7. 總結


PHP「Not enough Memory」實戰排錯筆記

——一次 5 MB 圖片上傳導致的內存溢出

1. 背景

  • 項目框架:Nginx + PHP-FPM 8.2

  • 文件管理器:Responsive Filemanager

  • 現象:上傳一張 5 MB 的 JPEG 原圖時,瀏覽器白屏,error_log 報:

    Not enough Memory (@/home/www/wwwroot/hnusri.cn/http/manager/plugins/ResponsiveFilemanager/filemanager/upload.php#241)
    
  • 默認配置memory_limit = 128M

2. 快速定位

  1. 開啟詳細日志

    display_errors = On
    log_errors     = On
    error_log      = /var/log/php/error.log
    
  2. 復現錯誤:上傳同一張圖片,觀察 Peak memory(見 §4)。

3. 為什么 5 MB 的圖片能耗盡 128 MB?

核心原因:GD 庫在解碼 / 縮放時會把整張圖片展開到內存,按 4 byte/像素 計,再疊加中間緩沖。

3.1 粗略估算公式(GD)
memory ≈ 寬 × 高 × 4 × 1.65
  • 4:32 bit 色深

  • 1.65:經驗系數,包含縮放 & 額外緩沖

分辨率文件體積*1估算內存128 MB 足夠嗎
3840×2160 (4 K)≈5 MB3840×2160×4×1.65 ≈ 54 MB??
6000×4000 (24 MP)*2≈5 MB158 MB?

*1 JPEG 在磁盤上是壓縮數據,跟解碼內存無關。
*2 手機/單反隨手拍常見 4–8 MB,但分辨率高達 20 ~ 30 MP。

4. 實際峰值監控

upload.php 適當位置插入:

register_shutdown_function(function () {error_log('Peak memory: ' . round(memory_get_peak_usage(true) / 1048576, 2) . ' MB');
});

再次上傳,日志輸出:

Peak memory: 163.14 MB

驗證了公式推算。

5. 解決過程

  1. 調高 memory_limit

    memory_limit = 512M
    

    重啟 PHP-FPM:

    sudo systemctl restart php-fpm
    

    再次上傳,問題消失,峰值 163 MB 以內,留足裕量。

  2. 同步調整上傳相關參數

    upload_max_filesize = 50M
    post_max_size       = 100M
    max_execution_time  = 300
    

6. 最佳實踐與防御措施

措施說明建議級別
限制分辨率Responsive Filemanager 支持 $image_max_width / $image_max_height????
使用 Imagickextension=imagick,解碼時按實際色深,內存占用可降 40–60 %???
異步生成縮略圖上傳→消息隊列→Worker 處理,避免前端線程內存峰值???
動態內存預算memory_limit ≈ 最大像素 × 4 × 1.65 × 并發系數??
壓縮上傳前端或 App 先做分辨率壓縮至 4 K 以內??

7. 總結

  • 根因圖片分辨率 決定解碼峰值,而非磁盤體積。

  • 經驗閾值:常見 24 MP 原圖解碼需 ~160 MB;并發 2 條就逼近 256 MB。

  • 最終 fix:將 memory_limit 提升至 512 MB 并優化上傳策略,系統穩定運行至今。

如果你的線上環境仍保持默認 128 MB,而站點允許上傳手機原圖或單反照片,最好立即評估并調優內存策略。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86926.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java垃圾回收機制和三色標記算法

一、對象內存回收 對于對象回收,需要先判斷垃圾對象,然后收集垃圾。 收集垃圾采用垃圾收集算法和垃圾收集器。 判斷垃圾對象,通常采用可達性分析算法。 引用計數法 每個對象設置一個引用計數器。每被引用一次,計數器就加1&am…

基于python網絡數據挖掘的二手房推薦系統

基于網絡數據挖掘的二手房推薦系統設計與實現 【摘要】 隨著互聯網技術在房地產行業的深入應用,線上房源信息呈爆炸式增長,給購房者帶來了信息過載的挑戰。為了提升二手房篩選的效率與精準度,本文設計并實現了一個基于網絡數據挖掘的二手房推…

Java + 阿里云 Gmsse 實現 SSL 國密通信

前言 解決接口或頁面僅密信瀏覽器(或 360 國密瀏覽器)能訪問的問題 測試頁面 測試網站-中國銀行:https://ebssec.boc.cn/boc15/help.html 使用其他瀏覽器(google,edge等)打開 使用密信瀏覽器打開 解決…

國產數據庫分類總結

文章目錄 一、華為系數據庫1. 華為 GaussDB 二、阿里系數據庫1. 阿里云 OceanBase2. PolarDB(阿里云自研) 三、騰訊系數據庫1. TDSQL(騰訊云)2. TBase(PostgreSQL增強版) 四、傳統國產數據庫1. 達夢數據庫&…

解密閉包:函數如何記住外部變量

🧠 什么是閉包? 閉包是一個函數對象,它不僅記住它的代碼邏輯,還記住了定義它時的自由變量(即非全局也非局部,但被內部函數引用的變量)。即使外部函數已經執行完畢,這些自由變量的值…

I2C協議詳解及STM32 HAL庫硬件I2C卡死問題分析

一、I2C協議詳解 1. I2C協議概述 Inter-Integrated Circuit (I2C) 是由 Philips 半導體(現 NXP 半導體)于 1980 年代設計的一種同步串行通信總線協議。該協議采用半雙工通信模式,支持多主從架構,專為短距離、低速率的芯片間通信…

HTTP協議-后端接收請求

起因就是不知道post這個請求體中這些格式有什么區別,后端又怎么去接收這些不同格式的內容 Get請求 get請求是比較簡單的一類 正常的直接用參數接收(不寫的話名字要匹配)或者RequestParam都可以接收,用對象綁定也可以 resultful…

HTML5 實現的圣誕主題網站源碼,使用了 HTML5 和 CSS3 技術,界面美觀、節日氛圍濃厚。

以下是一個 HTML5 實現的圣誕主題網站源碼,使用了 HTML5 和 CSS3 技術,界面美觀、節日氛圍濃厚。它包括: 圣誕樹動畫 🎄雪花飄落特效 ??圣誕祝福語 🎁響應式布局,適配移動端 你可以將代碼保存為 index.…

Spring Cloud Bus 和 Spring Cloud Stream

Spring Cloud Bus 和 Spring Cloud Stream 都是 Spring Cloud 生態中的消息通信組件,但它們的定位和使用場景有顯著區別: 1. Spring Cloud Bus 核心定位:分布式系統的消息廣播(配置刷新、事件傳播)。 典型場景&#x…

磁懸浮軸承位移信號的高精度估計:卡爾曼濾波算法深度解析

無需位移傳感器,濾波算法如何實現微米級精度? 磁懸浮軸承作為革命性的非接觸式支承技術,憑借無磨損、無需潤滑、高轉速等優勢,在飛輪儲能、高速電機、人工心臟泵和航空航天領域獲得了廣泛應用。其核心控制依賴于對轉子位移信號的高精度實時檢測,傳統電渦流傳感器雖能提供位…

DAY 43 預訓練模型

目錄 一、預訓練的概念 二、 經典的預訓練模型 2.1 CNN架構預訓練模型 2.2 Transformer類預訓練模型 2.3 自監督預訓練模型 三、常見的分類預訓練模型介紹 3.1 預訓練模型的發展史 3.2 預訓練模型的訓練策略 知識點回顧: 預訓練的概念常見的分類預訓練模型圖像…

Redis:事物

🌈 個人主頁:Zfox_ 🔥 系列專欄:Redis 🔥 什么是事務 Redis的事務和MySQL的事務概念上是類似的.都是把?系列操作綁定成?組.讓這?組能夠批量執?. 但是注意體會Redis的事務和MySQL事務的區別: 弱化的原?性:redi…

CppCon 2018 學習:An allocator is a handle to a heap Lessons learned from std::pmr

“An allocator is a handle to a heap — Lessons learned from std::pmr” 翻譯過來就是:“分配器(allocator)是對堆(heap)的一種句柄(handle)——從 std::pmr 中學到的經驗”。 基礎概念 分…

設備健康實時監測方法演進:從傳感網絡到AI決策樹的工業智能實踐

引言:當設備運維遇上AIoT革命 在工業4.0進程中,?毫秒級設備狀態捕獲能力正成為智能工廠的核心競爭力。傳統監測方法因數據滯后、診斷粗放被詬病,本文將深入探討三大前沿實時監測技術路徑,并揭秘中訊燭龍系統如何通過深度強化學習…

劍指offer53_二叉樹的深度

二叉樹的深度 輸入一棵二叉樹的根結點,求該樹的深度。 從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 數據范圍 樹中節點數量 [ 0 , 500 ] [0,500] [0,500]。 樣例 輸入&#…

探秘AI的秘密:leaked-system-prompts

揭秘:揭秘系統提示合集背后的秘密 在當今這個人工智能技術迅速發展的時代,了解和使用大型語言模型(LLM)已成為技術愛好者、開發者和研究人員的共同目標。而作為核心組成部分,系統提示(system prompts)的設計和應用直接影響了LLM的表現和功能。今天, 我們將為大家揭示一…

Gaming Mode四大功能(VRR、QMS、QFT、ALLM)

HDMI 2.1定義的Gaming Mode四大功能(VRR、QMS、QFT、ALLM)通過協同優化幀傳輸、刷新率同步與延遲控制,顯著提升了游戲和影音的流暢性與響應速度。以下是這些功能的詳細解析及其應用價值: 🔄 1. 可變刷新率(…

數據庫總結(關系代數-函數依賴-范式)

以下是關系代數中基本操作的詳細說明: 并(Union) 關系R和S的并操作表示為R ∪ S,要求R和S具有相同的屬性集(并相容性)。結果包含所有屬于R或S的元組,自動去除重復項。 示例: R …

react經驗:在nextjs中使用motion組件

什么是motion組件? 一種動畫組件 motion組件文檔 在nextjs中的應用步驟 1.安裝motion npm i framer-motion2.在next.config.js中配置轉義 export default {transpilePackages: [framer-motion] }3.開始應用 **注意要點:**在服務端渲染不可直接用&am…

怎樣大語言模型 遵守規則

如何讓應用中的提示工程更能適應未來變化 目錄 如何讓應用中的提示工程更能適應未來變化怎樣大語言模型 遵守規則提示詞 很有效:Memorize these rules提示可分為穩定組件和易變組件怎樣大語言模型 遵守規則 實驗背景:讓大語言模型可靠地遵守規則很難,尤其是規則數量增多時。…