PHP处理图片导致内存溢出
今天上传一些图片到我们的网站上,发现有些图片上传后没有任何提示就报错500,调试一下发现是在做图片处理的时候报错的,查日志后发现如下提示:
FastCGI sent in stderr: "PHP message: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes)
原来是内存溢出了,可是上传的图片都不大,因为网站限制上传文件不能超过10M,而ini配置文件中的上传限制和NGINX服务器的配置文件的上传限制都远大于10M,怎么还会内存溢出???
然后一番检索发现有位仁兄提出一个图片占用内存的公式:
(图片对象的width和height )X(图片的通道数,一般是3)X 1.7
按这个计算,我上传的4.2M的图片(6577 × 4385)占了140M,而默认的内存限制是128M,妥妥的超过了,不过这个公式应该是估算,实际报错提示占用了128.0078125M,也就刚好超过128M,离140M差得有点多,不过多次测试结果表明只要按这个公式计算结果小于134217728就不会内存溢出。
所以,方案是加上一个限制:长不超过6000px,宽不超过4000px,因为这个尺寸按上面的公式计算内存占用超不多116M。