我正在尝试将图片上传到我正在创建的应用程序中。 .png图像在文件系统中占用大约190KB,分辨率为2000px宽,1667px高。我已经为PHP设置了32MB的内存限制。 但是当我尝试上传这个.png图像时,我相信很多使用我的应用程序的人会这样做,我收到以下错误
Allowed memory size of 33554432 bytes exhausted (tried to allocate 13336000 bytes)
现在当我把这些计算成MB时,我明白它读了
Allowed memory size of 32MB exhausted ( tried to allocate 12.71MB )
所以我不明白的是,如何在文件系统上显示大小为190KB的文件最终会占用如此多的内存空间?是关于.png文件是如何在内存中处理的,我不知道的是什么?
这是代码
private function optimise_image($source_path, $destination_path){
list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_path);
//Using this source path, we'll create a memory instance of the image for processing
$source_image_ratio = $source_image_width/$source_image_height;
switch ($source_image_type) {
case IMAGETYPE_GIF:
$source_gd_image = imagecreatefromgif($source_path);
break;
case IMAGETYPE_JPEG:
$source_gd_image = imagecreatefromjpeg($source_path);
break;
case IMAGETYPE_PNG:
$source_gd_image = imagecreatefrompng($source_path);
break;
}
imagecreatefrompng()中发生错误。我在这里加载图像以降低其分辨率并设置其质量以优化查看时的存储和带宽。
经过进一步研究,我发现文件正在上传,服务器上文件的大小再次为190KB。所以你看到的那段代码就是它试图再次拾取文件进行处理的地方。在此之前,在文件被加载到内存中的过程中没有位置,然后离开那里而不被破坏(我认为这将是发生的事情)
如果您可能需要更多信息,请询问我,我会尝试相应地回答。
提前致谢:)
答案 0 :(得分:2)
图像宽度x图像高度x每个像素需要4个字节(32位),仅用于imagecreatefrompng / imagecreatefromjpeg
所以你的情况大概是12MB
GD lib和其他PHP进程只剩下20MB。