文件上传循环内存耗尽

时间:2017-02-10 19:22:03

标签: php

我正在建立一个评论网站,并且我的图片上传处理存在问题。我已经设置了我的php.ini以允许10M的max_file_uploadsize和60M的post_max_size,但是我将文件上传大小限制为6MB。我正在使用smart_resize_image function来调整图片大小。我允许上传最多5个图像并使用foreach循环遍历$ _FILES数组。这是我的图像处理代码:

        $allowed = array('image/pjpeg', 'image/jpeg', 'image/jpg', 'image/JPG', 'image/PNG', 'image/png');
        $i = 1;
        foreach($_FILES as $image) {
            if  (file_exists($image['tmp_name'])) {
                if (in_array($image['type'], $allowed)) {
                    if($image['size'] < 6291456) {  
                        include_once('/inc/smart_resize_image.function.php');
                        $movedL = '/public_html/ureview/images/restaurants/'.$pid.'/'.$sid.'-'.$i.'.jpg';
                        smart_resize_image($image['tmp_name'], null, 800, 500, true,$movedL, true,false,100);
                        $i++;
                    }else{
                        echo'Image #'.$i.' file size limit of 5MB!';
                        exit();
                    }
                }else{
                    echo'Image #'.$i.' file type not allowed!';
                    exit();
                }
            }
        }    

我得到的错误是:

 Allowed memory size of 33554432 bytes exhausted (tried to allocate 12288 bytes) in /inc/smart_resize_image.function.php

我认为问题是smart_resize_image函数在处理后取消链接但没有释放内存。我知道有多个网站可以处理图片上传,所以有可能但我无法弄清楚我的代码需要更改的内容。

编辑: 我希望看看我的代码中是否存在效率低下导致错误发生的原因。

1 个答案:

答案 0 :(得分:1)

我看到$output的{​​{1}}参数描述为

  

@param $ output - 新文件的名称(如果需要,包括路径)

但我也在line 110上看到你可以传递smart_resize_image并且它会使函数返回图像资源:

'return'

现在您可以销毁,但在销毁之前,您需要将其保存为文件(您现在需要自己实现的$res = smart_resize_image($image['tmp_name'], null, 800, 500, true,'return', true,false,100); 函数的第218-226行)。所以你就是这样做的:

smart_resize_image()

上面的代码现在使用// smart_resize_image($image['tmp_name'], null, 800, 500, true,$movedL, true,false,100); /* OLD */ $quality = 100; $info = getimagesize($image['tmp_name']); $res = smart_resize_image($image['tmp_name'], null, 800, 500, true,'return', true,false,100); switch ( $info[2] ) { case IMAGETYPE_GIF: imagegif($res, $movedL); break; case IMAGETYPE_JPEG: imagejpeg($res, $movedL, $quality); break; case IMAGETYPE_PNG: $quality = 9 - (int)((0.9*$quality)/10.0); imagepng($res, $movedL, $quality); break; default: break; } imagedestroy ( $res ); // Now you should be able to destroy the resource (returned from the 'smart_resize_image' function) 释放与图像资源相关的任何内存,并希望能阻止你使内存耗尽错误