我正在尝试使用PHP:GD来处理JPEG图像目录(大约600+,范围从50k到500k)以调整大小并保存图像但我在这个过程中很早就遇到了一些障碍。正确处理3个图像(30K,18K和231K)后,我得到允许的内存大小为16777216字节耗尽 PHP致命错误。
我正在浏览图像并调用下面的代码:
list($w, $h) = getimagesize($src);
if ($w > $it->width) {
$newwidth = $it->width;
$newheight = round(($newwidth * $h) / $w);
} elseif ($w > $it->height) {
$newheight = $it->height;
$newwidth = round(($newheight * $w) / $h);
} else {
$newwidth = $w;
$newheight = $h;
}
// create resize image
$img = imagecreatetruecolor($newwidth, $newheight);
$org = imagecreatefromjpeg($src);
// Resize
imagecopyresized($img, $org, 0, 0, 0, 0, $newwidth, $newheight, $w, $h);
imagedestroy($org);
imagejpeg($img, $dest);
// Free up memory
imagedestroy($img);
我尝试使用imagedestroy
函数释放内存,但似乎没有任何影响。该脚本始终一直窒息imagecreatefromjpeg
代码行。
我检查了php.ini,memory_limit = 16M
设置似乎正确。但我无法弄清楚为什么内存会填满。它不应该将内存释放回垃圾收集器吗?我真的不想增加memory_limit设置。这似乎是一个糟糕的解决方法,可能会在未来导致更多问题。
仅供参考:我正在从命令提示符运行我的脚本。它不应该影响功能,但可能会影响你的反应,所以我想我应该提一下。
任何人都可以看到我是否只是遗漏了一些简单的东西,或者这里是否存在设计缺陷?你认为这将是一个非常简单的任务。当然这必须是可能的,对吗?
答案 0 :(得分:17)
ini_set('memory_limit', '64M');
问题解决了
答案 1 :(得分:13)
您的一个或多个图像可能实际上在原始内存中膨胀到16M。一种检查方法是在Photoshop或Irfanview中打开它并检查颜色空间和像素尺寸。
达到16M并不需要太多,例如,考虑一个“低”的600万像素摄像头。它创建了一个3072像素乘2048像素的图像。每个颜色的字节数(RGB),原始大小为:
3072 x 2048 x 3 = 18,874,368
因此,您可能希望根据预期处理的最大图像增加内存。但你必须考虑它们的原始尺寸。
答案 2 :(得分:1)
在某些情况下,您根本无法预测将要处理的图像所需的最高内存分配。为了防止崩溃,您可以在循环之前和之后包含以下命令:
register_shutdown_function ('my_function');
$mem_limit = ini_get ('memory_limit');
ini_set ('display_errors', false);
ini_set ('memory_limit', '400M'); // some high value
(......你的过程......)
ini_set ('memory_limit',$mem_limit);
并在函数“my_function()”中放置将处理崩溃的代码。
答案 3 :(得分:0)
只需使用ini_set();
并将memory_limit设置为您想要的任何大小。