试图在本地上传1M文件,我收到致命错误

时间:2008-11-19 13:43:29

标签: php

“致命错误:允许的内存大小耗尽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);

修改

现在有希望解决这个问题。我的一位同事一直都有解决方案,却忽略了告诉我!

4 个答案:

答案 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? 如果是,那么再增加一点。