当前位置: 首页 > news >正文

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.lryc.cn/news/540553.html

相关文章:

  • 网络IP跳动问题解决详
  • Linux firewalld 常用命令
  • LeetCode 热题 100 49. 字母异位词分组
  • 从 DeepSeek 到飞算 JavaAI:AI 开发工具如何重塑技术生态?
  • OceanBase 初探学习历程之二——操作系统参数最佳实践
  • 全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
  • 《机器学习实战》专栏 No12:项目实战—端到端的机器学习项目Kaggle糖尿病预测
  • 【vue项目中如何实现一段文字跑马灯效果】
  • DeepSeek 细节之 MLA (Multi-head Latent Attention)
  • Python爬虫具体是如何解析商品信息的?
  • lerobot调试记录
  • 【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
  • Jenkins 配置 Credentials 凭证
  • Datawhale Ollama教程笔记5
  • 小爱音箱连接电脑外放之后,浏览器网页视频暂停播放后,音箱整体没声音问题解决
  • go设置镜像代理
  • Python爬虫系列教程之第十二篇:爬虫异常处理与日志记录
  • 将Google文档导入WordPress:简单实用的几种方法
  • 大白话实战Gateway
  • 深入学习解析:183页可编辑PPT华为市场营销MPR+LTC流程规划方案
  • 【微中子代理踩坑-前端node-sass安装失败】
  • 使用open-webui+deepseek构建本地AI知识库
  • CSS盒模
  • 【开源向量数据库】Milvus简介
  • 机器学习笔记——常用损失函数
  • Nginx--日志(介绍、配置、日志轮转)
  • 2025 vue3面试题汇总,通俗易懂
  • 一周学会Flask3 Python Web开发-Debug模式开启
  • 聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调 视觉、触觉、听觉
  • C++ 无锁队列:原理与实现