我在Laravel 5上使用了很棒的intervention library实现了一些图像处理。如果图像很小,它可以正常工作,例如700KB以下,尺寸小于800px宽。
但是它无法处理大尺寸图像,我想上传大小为8 MB且宽度为2000像素的图像。
我尝试了碰撞memory_limit
的经典方法,但它不起作用
ini_set("memory_limit","20M");
是否有任何解决方案可以在不杀死服务器的情况下运行。
以下是我的上传服务的代码。它从Request::file('file')
获取图像并使用干预将其调整为3种尺寸。
Thumb是200px宽
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;
}
请帮助我如何让它更快更有效率
答案 0 :(得分:1)
只需将php.ini文件的memory_limit更新为256M。
memory_limit=256M
我尝试使用其他memory_limit和128和20。这对我不起作用。但是当我将内存限制更新为256M时,问题就为我解决了。
在面板中,您将找到PHP选项。然后,您需要将内存限制更新为:
memory_limit=256M
or
memory_limit=192M
or
memory_limit=368M
or
memory_limit=512M
答案 1 :(得分:0)
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
This solution为我工作的是更改内存限制,如下所示:
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可能需要高达32 MB的内存。即使图像文件大小不足1个 <子> @olivervogel。 2018.允许的内存大小耗尽134217728个字节。 [在线]适用于:https://github.com/Intervention/image/issues/567#issuecomment-224230343。 [2018年6月14日访问]。