【问题标题】:Trying to upload a 1M file locally and i get a Fatal Error尝试在本地上传 1M 文件,但出现致命错误
【发布时间】:2008-11-19 13:43:28
【问题描述】:

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

编辑

希望现在已经解决了这个问题。我的一位同事一直有解决方案,但没有告诉我!

【问题讨论】:

  • 这有点含糊。也许发布一段 sn-p 代码可以帮助人们理解你在做什么(如果 bug 是你的错)
  • 只是一个挑剔,但 $imagecopy、$imagejpg 和 $source 不是资源,所以你不应该对它们调用 imagedestroy。

标签: php


【解决方案1】:

您可能会加载图像以对其进行一些操作。这会导致图像数据被解压缩,这需要大量内存用于大图像(我认为每个像素大约 4 个字节)。

您可以选择不处理图像,或者在 PHP 之外进行处理 - 例如通过调用 ImageMagick 或其他程序。这在一定程度上取决于您要完成的工作。

【讨论】:

  • 不幸的是,它适用于需要自动缩略图的网站。
  • 把内存限制再提高一些。它不会长时间保留内存,因此不会影响您的服务器性能。使用 ini_set 比使用 apache config 更好,那么你所有的其他脚本仍然会有一个低限制,以防它们失控
【解决方案2】:

这与您上传的图像的(文件)大小无关,打破内存限制的调用是 imagecreatetruecolor()。

imagecreatetruecolor() 将分配一个内存区域来存储真彩色图像,no 压缩,每个像素使用 32 位(4 字节)。

例如,对于 1024x768 像素的图像,imagecreatetruecolour() 将使用 1024*768*4 = 3145728 字节,或大约 3MB。

问题在于,这种规模扩大得相当厉害。一个 3072x2034(6 兆像素)的图像,通过同样的计算,需要大约 24MB 才能加载到内存中 - 我猜这就是你正在处理的那种大小。

解决方案是将处理交给其他东西,比如 imagemagick 或 NetPBM,它们将作为一个单独的进程运行并且不计入 PHP 内存限制。

NetPBM 是我个人的最爱,看起来像:

anytopnm <file> | pnmscale -xysize <dimensions> | pnmtojpg  > <outfile> 

【讨论】:

    【解决方案3】:

    如上所述here

    不要忘记 imagedestroy() 函数,或缓存您的缩略图 - 它们会为您节省大量工作。

    【讨论】:

      【解决方案4】:

      你增加内存限制后是否重启了apache? 如果是,那就再增加一点。

      【讨论】:

      • 是的,这并没有成功。现在高达 30M,但仍然是 sam 错误。
      • 如果您尝试使用较小的图像,会发生这种情况吗?比如说 640x480 和大约 100kb - 150kb ?
      猜你喜欢
      • 2023-03-14
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2019-04-17
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      相关资源
      最近更新 更多