https://www.cnblogs.com/68xi/p/10993602.html
用过GD库的同学可能都知道,使用imagecreatetruecolor()函数创建一个真彩色的画布是第一步。但是,如果画布的宽高超过平常的宽高,会带来极大的内存消耗。比如,一个9600×4800的画布,会带来190M的内存消耗。这时,如果服务器的free空间过小,就会导致内存耗尽,出现各种报错。本文旨在提供优化服务器时对大图片的处理方法。
首先,说下业务场景。我要对用户上传的图片进行裁剪,变成我想要的宽高比。注意,是2:1这种宽高比。 因为用的服务器内存总共只有512M,处理小图片时还好,但是一旦接触到4M以上的图片文件,内存耗尽就成了一个block的点。它会引发nginx报502的错误,因为nginx无法从php-fpm那里获取到相应的值。报错日志:a client request body is buffered to a temporary file。3119133 recv() failed (104: Connection reset by peer) while reading response header from upstream 这里可以提供下,我使用GD库对图片进行处理时的内存占用情况的日志:
|
|
1 |
获取大小内存-1 376.12 kb |
2 |
获取大小内存 4.98 mb |
3 |
#这里使用了imagecreatetruecolor |
4 |
获取大小内存2 192.53 mb 图片width:9600height4800 |
5 |
获取大小内存3 287.92 mb |
6 |
获取大小内存4 287.92 mb |
7 |
获取大小内存5 287.92 mb |
8 |
获取大小内存6 100.38 mb |
9 |
获取大小内存7 104.48 mb |
10 |
#这里实行了最后一步,释放内存 获取大小内存+1 376.21 kb |
可以看到,很明显的内存占用,关于图片宽高对内存的影响,网上有个公式:
…