“致命错误:允许的内存大小耗尽31457280字节(尝试分配9828字节)”。
这是我得到的错误,但我只是尝试上传1mb图像。我增加了php.ini中的内存限制和执行时间。我在使用firefox的Mac上的本地MAMP服务器上尝试此操作。这将是一个在线图片库。 有任何想法吗? 以下是代码:
ini_set("memory_limit","30M");
if(isset($_POST['submit'])){
if (isset ($_FILES['new_image'])){
$imagename = $_FILES['new_image']['name'];
$source = $_FILES['new_image']['tmp_name'];
$target = "images/".$imagename;
move_uploaded_file($source, $target);
$imagepath = $imagename;
//below here for the removed code
$save = "thumbs/uploads/" . $imagepath; //This is the new file you saving
$file = "images/" . $imagepath; //This is the original file
$imagesize = getimagesize($file);
list($width, $height) = $imagesize;
unset($imagesize);
if($width>$height)
{
$modwidth = 150;
$diff = $width / $modwidth;
$modheight = $height / $diff;
}else{
$modheight = 150;
$diff = $height / $modheight;
$modwidth = $width / $diff;
}
$tn = imagecreatetruecolor($modwidth, $modheight);
$image = imagecreatefromjpeg($file);
$imagecopy = imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
imagedestroy($image);
imagedestroy($im);
imagedestroy($imagecopy);
imagedestroy($source);
$imagejpg = imagejpeg($tn, $save, 100);
imagedestroy($tn);
imagedestroy($imagejpg);
修改
现在有希望解决这个问题。我的一位同事一直都有解决方案,却忽略了告诉我!
答案 0 :(得分:4)
您可能正在加载图像以对其进行一些操作。这导致图像数据被解压缩,这需要大量内存用于大图像(我认为每个像素大约4个字节)。
您可以选择不处理图像,也不选择在PHP之外进行处理 - 例如通过调用ImageMagick或其他程序。这取决于你想要完成的事情。
答案 1 :(得分:3)
这与您上传的图片的(文件)大小无关,打破内存限制的调用是imagecreatetruecolor()。
imagecreatetruecolor()将分配一个内存区域,用 no 压缩存储真彩色图像,每个像素使用32位(4个字节)。
因此,对于1024x768像素的图像,imagecreatetruecolour()将耗尽1024 * 768 * 4 = 3145728字节,或大约3MB。
问题是这种情况非常显着。一个3072x2034(600万像素)的图像,通过相同的计算,需要大约24MB才能加载到内存中 - 我猜这是你正在处理的那种尺寸。
解决方案是将处理交给像imagemagick或NetPBM这样的其他东西,它将作为一个单独的进程运行,而不计入PHP内存限制。
NetPBM是我个人的最爱,看起来像是:
anytopnm <file> | pnmscale -xysize <dimensions> | pnmtojpg > <outfile>
答案 2 :(得分:1)
如上所述here:
不要忘记imagedestroy()函数或缓存缩略图 - 它们将为您节省大量的工作。
答案 3 :(得分:0)
在增加内存限制后是否重启了apache? 如果是,那么再增加一点。