php处理图片出现内存溢出(Allowed memory size of 134217728 bytes exhausted)

错误

最近做图片上传功能时发现上传某些图片时报内存溢出错误。如下所示:

{"code": 0,"msg": "Allowed memory size of 134217728 bytes exhausted (tried to allocate 24576 bytes)","data": {"code": 0,"line": 1806,"file": "\myweb\\ytems\app\\common.php","message": "Allowed memory size of 134217728 bytes exhausted (tried to allocate 24576 bytes)","trace": [{"function": "appShutdown","class": "think\\initializer\\Error","type": "->","args": []}]}
}

初步检查图片详情,发现图片并不大为861KB,服务器配置的内存上限是128MB,接口上传图片限制是2MB。排除图片大小限制问题。但发现此图片的分辨率为 5283x7727,初步怀疑是图片分辨率过大导致。

解决:

1、找出原因

通过对多张不同大小分辨率的图片进行测试发现果然是大分辨率的图片才会导致此报错,通过排查程序代码发现是在调用 imagecreatefromjpeg 图片处理函数时报的错误。

查看官方文档,才发现imagecreatefromjpeg在动态创建一个新图像时,是根据图片的分辨率(宽和高)在内存中生成一个新图像。

因此虽然用户上传的图片只有为861KB,但分辨率却高达 5283x7727,按照官方手册给出的公式可算出内存已达到(5283*7727*24/8*其它因素>117MB),加上其他程序消耗内存。很容易超过128MB内存上限,才导致内存溢出。

官方手册

imagecreatefromjpeg创建图像时占用内存公式:

总字节数=宽*高*每像素所占字节数*其它因素  (即 5283*7727*24/8*其它因素)

每像素所占字节数有2种计算方式:

每像素所占字节数
=位深/ 8
=色深(bits) *图像的通道(channels) / 8

(php使用getimagesize可以获取jpg图片的bits和channels,位深:如下图,在电脑上查看图片的属性->详细信息)

由此可知,imagecreatefromjpeg创建新图像的动作是在内存中实现,因此图像的宽和高很大程度上决定了内存的消耗。

2、在图片上传时限制图片的像素大小

相关函数如下:

/*** 校验图片像素大小* @param $sourceFile 原始图片文件* @param $$allowed_size 允许的像素大小* @return array* @throws Exception*/
function valImage($sourceFile, $allowed_size=4000) {ini_set('memory_limit', '256M');// 检查GD库是否可用if (!extension_loaded('gd') || !function_exists('gd_info')) {//throw new Exception('GD库未安装');return ['code'=>4001,'msg'=>'GD库未安装'];}// 验证源文件if (!file_exists($sourceFile)) {//  throw new Exception('源文件不存在');return ['code'=>4002,'msg'=>'源文件不存在'];}// 获取图片信息$imageInfo = @getimagesize($sourceFile);if (!$imageInfo) {//throw new Exception('无效的图片文件');return ['code'=>4003,'msg'=>'无效的图片文件'];}//    print_r($imageInfo);if($imageInfo[0] > $allowed_size|| $imageInfo[1]  > $allowed_size){return ['code'=>4000,'msg'=>'图片分辨率不可大于'.$allowed_size.'*'.$allowed_size.'像素'];}return ['code'=>200,'msg'=校验通过'];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23206.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring——SpringSecurity开发经验实战

摘要 本文介绍了一个简单的 Spring Security 实战示例,涵盖基本的身份验证和授权流程。首先介绍了 Spring Security 是一个强大的安全框架,用于在 Spring 应用中实现身份验证、授权以及保护应用免受常见安全攻击。接着详细阐述了项目结构、添加 Spring …

Innovus中快速获取timing path逻辑深度的golden脚本

在实际项目中我们经常会遇到一条timing path级数特别多,可能是一两页都翻不完。此时,我们大都需要手工去数这条path上到底有哪些是设计本身的逻辑,哪些是PR工具插入的buffer和inverter。 数字IC后端手把手培训教程 | Clock Gating相关clock …

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

数据结构绪论

一-数据结构的基本概念 1-数据 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 2-数据元素 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。…

kafka基本知识

什么是 Kafka? Apache Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的一部分。Kafka 主要用于构建实时数据管道和流处理应用程序。它能够高效地处理大量的数据流,广泛应用于日志收集、数…

DeepSeek R1本地+私有云版医疗AI部署开发成功案例技术剖析

1. 引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(AI)在医疗领域的应用正逐渐成为推动医疗行业变革的重要力量。近年来,医疗 AI 取得了显著的进展,从疾病诊断、药物研发到医疗管理等各个环节,AI 技术都展现出了巨大的潜力。它能够处理和分析海量的医疗数据,为…

网络安全-openssl工具

OpenSSl是一个开源项目,包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准,并且拥有比较长的历史,现在几乎所有的服务器软件和很多客户端都在使用openssl,其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

el-dropdown选中效果

vue2版本 <template><el-dropdown size"mini" command"handleCommand"><span class"el-dropdown-link">{{ selectedOption }}<i class"el-icon-arrow-down el-icon--right"></i></span><el-d…

Deepseek首页实现 HTML

人工智能与未来&#xff1a;机遇与挑战 引言 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了突飞猛进的发展。从语音助手到自动驾驶汽车&#xff0c;AI 正在深刻地改变我们的生活方式、工作方式以及社会结构。然而&#xff0c;随着 AI 技术的普及…

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…

Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件&#xff0c;专注于处理高并发流量分发&#xff0c;广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么&#xff1f; 本质&#xff1a; 基于 C 语言开发 的轻量级工具&a…

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内&#xff0c;右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑&#xff0c;点击【属性】 5.下滑滚动条&…

Spring Boot 日志管理(官网文档解读)

摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容&#xff0c;文章主要参考官网文章的描述内容&#xff0c;并在其基础上进行一定的总结和拓展&#xff0c;以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…

【废物研究生零基础刷算法】DFS与递归(一)典型题型

文章目录 跳台阶递归实现指数级枚举递归实现排列型枚举上面两题总结 递归实现组合型枚举P1036选数 跳台阶 思路&#xff1a; 如果 n 1&#xff0c;只有一种走法&#xff08;走 1 级&#xff09;。如果 n 2&#xff0c;有两种走法&#xff08;11 或 2&#xff09;。对于 n &g…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

at32f103a+rtt+AT组件+esp01s 模块使用

AT组件使用 这里需要设置wifi名称和密码 配置使用的串口 配置上边的自动会配置,at_device 依赖了at_client 依赖sal也自动加入 依赖了串口2 uart2 连接WiFi AT+ CWJAP = TP-LINK_45A1

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类&#xff0c;只要是他的子类&#xff0c;或子类的子类&#xff0c;都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…