PHP memory_get_peak_usage未统计GD库内存使用的问题求助
PHP GD库imagecreatefromjpeg()内存占用未被memory_get_peak_usage统计的问题
环境信息
- 服务器系统:Debian 12
- Web服务组合:Nginx/1.26.2 + PHP-FPM 8.2.26(CLI版本一致),Zend Engine v4.2.26
- 已安装扩展:php-gd
问题现象
使用imagecreatefromjpeg()加载高分辨率图片时,PHP进程实际内存占用超过300M,但memory_get_peak_usage(true)仅返回2M左右的数据,导致php.ini中设置的memory_limit完全起不到限制作用。当实际内存耗尽时,PHP-FPM进程会被系统直接终止。
在另一台Apache+PHP 8.3.14(php83-cgi,Zend Engine v4.3.14)的服务器上测试相同代码,memory_get_peak_usage()能正确统计到300M+的内存占用;即使将问题服务器升级到PHP 8.3.15,该问题依然存在。
测试代码
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); $file="/var/www/html/test2.jpg"; $src_img=imagecreatefromjpeg($file); // 此操作占用的300M+内存未被统计 print 'Memory usage: '. round(memory_get_peak_usage(true)/(1024*1024)) . 'M<br />'; // 返回结果约2M
复现步骤
- 安装全新Debian 12系统
- 部署Nginx、官方PHP包及php-gd扩展
- 将一张高分辨率图片(加载后会占用300M+内存)放置在
/var/www/html/test2.jpg路径下 - 执行命令
sudo php /var/www/html/test.php,输出仅显示约2M内存占用,但通过top命令查看,PHP进程实际内存占用超过300M
风险与临时解决方案
- 严重风险:若用户上传高分辨率但文件体积小的图片,PHP进程可能占用3G+内存,直接导致服务崩溃
- 临时方案:先调用
getimagesize()获取图片分辨率,根据分辨率预估内存占用后,再决定是否调用GD库进行处理
求助
希望有相关经验的开发者提供彻底解决该问题的方案,感谢支持!
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

