9

我正在使用 Laravel 5 上的出色干预库来实现一些图像处理。如果图像很小,它可以正常工作,比如小于 700KB 且尺寸小于 800px 宽。

但它无法处理大尺寸图片,我想上传 8 MB 宽、2000 像素宽的图片。

我尝试过经典的碰撞方法,memory_limit但它不起作用

ini_set("memory_limit","20M");

是否有任何解决方案可以在不杀死服务器的情况下工作。

这是我的上传服务的代码。它使用干预从图像中获取图像Request::file('file')并将其调整为 3 种尺寸。

  • 大尺寸,最大宽度为 2000 像素,然后是
  • 中等 800 像素宽
  • 拇指宽 200 像素

    public function photo($file)
    {
        $me = Auth::user();
        //user folder for upload
        $userFolder = $me->media_folder;
    
        //Check the folder exist, if not create one
        if($this->setupUsrFolder($userFolder)) {
            //Unique filename for image
            $filename = $this->getUniqueFilename($userFolder);
    
            //Bump the memory to perform the image manipulation
            ini_set("memory_limit","20M");
    
            //Generate thumb, medium, and max_width image
            $img = Image::make($file);
            //big_img
            $big = $img->resize(config('go.img.max_width'), null, function ($constraint) {
                $constraint->aspectRatio();
                $constraint->upsize();
            });
            //Big Image
            $big->save($this->getPhotoPath($filename, $userFolder, 'b_'));
    
            //Medium image
            $med = $big->resize(config('go.img.med_width'), null, function ($constraint) {
                $constraint->aspectRatio();
                $constraint->upsize();
            });
            $med->save($this->getPhotoPath($filename, $userFolder, 'm_'));
    
            //Thumbnail
            $thumb = $med->resize(config('go.img.thumb_width'), null, function ($constraint) {
                $constraint->aspectRatio();
                $constraint->upsize();
            });
            $thumb->save($this->getPhotoPath($filename, $userFolder, 't_'));
    
            return $filename;
        }
    
        return null;
    }
    

请帮助我如何提高效率和速度

4

2 回答 2

10

FWIW,评论的解决方案对我不起作用。也就是说,我无法让以下内容为我工作:

Image::make($file)->resize(2000, null)->save('big.jpg')->destroy();
Image::make($file)->resize(800, null)->save('med.jpg')->destroy();
Image::make($file)->resize(200, null)->save('thumb.jpg')->destroy();

它仍然抛出以下错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16384 bytes) in  
C:\Users\XXX\app\vendor\intervention\image\src\Intervention\Image\Gd\Decoder.php on line 136

这个对我有用的解决方案是更改内存限制,如下所示:

public function resize() {
    ini_set('memory_limit', '256M');
    // Do your Intervention/image operations...
}

// or...

ini_set('memory_limit', '256M');
Image::make($file)->resize(2000, null)->save('big.jpg');
Image::make($file)->resize(800, null)->save('med.jpg');
Image::make($file)->resize(200, null)->save('thumb.jpg');

这样就成功解决了问题。
原因是:

调整图像大小是一项非常消耗内存的任务。您不能假设 1MB 的图像占用 1MB 的内存。例如,将 3000 x 2000 像素的图像调整为 300 x 200 可能会占用多达 32MB 的内存。即使图像小于 1MB 文件大小。
@olivervogel。2018. 允许的内存大小为 134217728 字节已用尽。[在线] 位于:https ://github.com/Intervention/image/issues/567#issuecomment-224230343 。[2018 年 6 月 14 日访问]。

于 2018-06-14T09:43:13.010 回答
2

只需将 php.ini 文件 memory_limit 更新为 256M。

memory_limit=256M

我尝试过使用 128 和 20 的其他 memory_limit。这对我不起作用。但是当我将内存限制更新为 256M 时,问题就解决了。

在 cpanel 中,您将找到 PHP 选项。从那里您需要将内存限制更新为:

memory_limit=256M
or
memory_limit=192M
or
memory_limit=368M
or
memory_limit=512M
于 2019-11-26T21:34:10.260 回答