【问题标题】:PHP Memory Limit 25MB Exhausted - File Upload/Crop/ResizePHP 内存限制 25MB 已用尽 - 文件上传/裁剪/调整大小
【发布时间】:2010-12-16 15:28:41
【问题描述】:

我正在对最大 10MB 的文件使用单个图像上传/裁剪/调整大小脚本。

测试的时候,我把php_ini的内存限制设置为25M,上传一个文件只有1.4MB左右就用完了。

"Allowed memory size of 26214400 bytes exhausted (tried to allocate 10368 bytes)"

这对我来说似乎很奇怪,不是 10368

或者这是否意味着我的 10368 字节超过了 25MB?我的脚本应该使用这么多内存吗?

代码:

function make_thumbnails($updir, $img)
{
    $thumbnail_width    = 200;
    $thumbnail_height   = 150;
    $thumb_preword  = "thumb_";

    $arr_image_details  = GetImageSize($updir.$img);
    $original_width = $arr_image_details[0];
    $original_height    = $arr_image_details[1];

    if( $original_width > $original_height ){
        $new_width  = $thumbnail_width;
        $new_height = intval($original_height*$new_width/$original_width);
    } else {
        $new_height = $thumbnail_height;
        $new_width  = intval($original_width*$new_height/$original_height);
    }

    $dest_x = intval(($thumbnail_width - $new_width) / 2);
    $dest_y = intval(($thumbnail_height - $new_height) / 2);

    if($arr_image_details[2]==1) { $imgt = "ImageGIF";  $imgcreatefrom = "ImageCreateFromGIF";  }
    if($arr_image_details[2]==2) { $imgt = "ImageJPEG"; $imgcreatefrom = "ImageCreateFromJPEG";  }
    if($arr_image_details[2]==3) { $imgt = "ImagePNG";  $imgcreatefrom = "ImageCreateFromPNG";  }

    if( $imgt )
    {
        $old_image = $imgcreatefrom($updir.$img);
        $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
        imageCopyResized($new_image,$old_image,$dest_x,
        $dest_y,0,0,$new_width,$new_height,$original_width,$original_height);
        $imgt($new_image,$updir.$thumb_preword.$img);

        // Added by your suggestions:
         imagedestroy($old_image);
         imagedestroy($new_image);
    }
}

【问题讨论】:

  • 您在尝试分配另外 10368 个字节时刚刚达到内存限制。请向我们展示一些代码,以便我们为您提供帮助。
  • 感谢您的输入,代码已发布
  • 真的很难决定最佳答案,你们共同回答了我想要的答案。谢谢!!

标签: php upload resize crop memory-limit


【解决方案1】:

或者这是否意味着我在 25MB 上占用了 10368 个字节?

没有。您的脚本试图分配 10368 字节,10368 + 已分配 > 25MB

我的脚本应该使用这么多内存吗?

如果您使用 GD 调整大小,可以。我会尝试使用其他库或控制台工具进行图像处理,它们可以提供更多性能。而且,如果是公共网站,您可以决定使用队列进行图像处理,而不是即时调整图像大小

【讨论】:

    【解决方案2】:

    使用后使用imagedestroy释放内存:

    if( $imgt )
    {
        $old_image = $imgcreatefrom($updir.$img);
        $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
        imageCopyResized($new_image,$old_image,$dest_x,
        $dest_y,0,0,$new_width,$new_height,$original_width,$original_height);
        imagedestroy($old_image);
        $imgt($new_image,$updir.$thumb_preword.$img);
        imagedestroy($new_image);
    }
    

    【讨论】:

    • 太好了,这让我的内存使用量减少了一些。我应该注意其他有这个问题的人,正确的语法是 imagedestroy($new_image);谢谢!
    • @Paul Silvis:谢谢。幸运的是,当我实际输入image_destroy 时,PHP.net 显示了正确的功能。
    【解决方案3】:

    错误消息说它试图再分配 10368 个字节,但它不可用。换句话说,您的 25MB 池已用完,脚本无法分配所需的 10368 字节。

    您可以在 php.ini 文件中增加此限制,方法是添加或更新类似于以下内容的行:

    memory_limit = 64M
    

    至于“如果 25MB 就足够了”,这对我们来说是一个很难回答的问题……当然,有些脚本确实需要 64MB 甚至更多。如果您发现必须不断增加内存池的大小,我会开始调查是什么占用了这么多空间。

    Here is a related question 对您的内存池大小进行了一些很好的讨论。

    编辑 看到您发布的代码,在处理图像时肯定会消耗大量内存。完成图像资源后,您可以通过调用 imagedestroy 来帮助您的脚本。

    【讨论】:

      【解决方案4】:

      除了已经说过的:

      永远不要忘记处理压缩文件格式(如 JPEG)需要比实际文件大小更多的内存。一个 3000 x 3000 像素的 JPG 文件只能重 500kb,但需要(大约)3000 x 3000 x 3(红色、绿色和蓝色各一个字节,根据模式甚至 Alpha 多一个字节)= 至少 27 MB .

      【讨论】:

      • 谢谢,这确实使估计“可接受”的效率成为焦点。
      • +1 我敢打赌,他的代码是通过调试器运行的,他会在$imgcreatefrom($updir.$img); 炸毁(如果他没有粘贴的错误消息的一部分还没有指出该行)。
      【解决方案5】:

      这意味着在您超出限制的那一刻,您的脚本试图分配 10368 字节但没有成功。这并不意味着如果您将限制增加到 26MB,您将不再遇到此问题。该错误可能会在稍后发生。您可以尝试以较小的步长(例如 32MB、48MB 等)增加它,直到不再出现此错误。

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 2011-10-08
        • 2011-09-23
        • 2013-12-18
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多