2011-08-17 53 views
1

致命错误:用尽33554432个字节允许存储器大小(试图分配4912个字节)在/var/www/development/example/system/libraries/Image.php上线。PHP重建图像:存储器使用

问题中的JPEG图像没有特别大的文件大小(741 KB)。我们使用相同的代码来重建更大的图像。但是,图像的尺寸非常大(4912px x 3264px)。这会有效果吗?

什么决定了PHP重建映像时的内存使用情况?它只是文件大小?尺寸?颜色密度?文件类型?

上打破了这行是

$f1 = 'imagecreatefrom' . $tag; 
$src = $f1($file); 

我认为这是足够的上下文。它没有达到试图重建图像的程度。将它加载到内存中足以打破它。

+0

你用什么来建立图像? gd,GraphicsMagick,ImageMagick还是别的? – Carpetsmoker 2011-08-17 11:58:56

+0

这取决于我想。我们可以看到错误正在讨论的代码吗? – Bojangles 2011-08-17 11:59:12

回答

2

正如riky所说,如果可以的话,将内存限制设置得更高。也意识到尺寸比文件尺寸更重要(因为文件尺寸是针对压缩图像的)。在GD中打开图像时,每个像素都会分配3-4个字节,RGB和可能A.因此,您的4912px x 3264px图像需要使用48,098,304到64,131,072字节的内存,再加上开销和任何其他内存脚本正在使用。

0

这取决于你的执行力度增加内存缓冲区大小

php_value memory_limit 64M在.htacess

ini_set('memory_limit','64M');。上次当我用csv文件处理超过500000条记录时,我收到了同样的信息。稍后我会介绍一些类并尝试关闭打开的对象。它减少了它的消耗量。如果你正在打开一张图片并进行编辑。这意味着它正在加载到内存中。在这种情况下尺寸真的很重要。如果您正在操作多个图像。我会记录到每个图像一个,然后关闭该图像。根据我的经验,当时我正在处理pdf图稿文件以检查裁剪标记。我有同样的错误。

//you can set the memory limits values 
// in htaccess 
php_value memory_limit 64M 
//or in you using following in php 
ini_set('memory_limit', '128M'); 
//or update it in your php.ini file 

但是如果你优化你的代码。并使用面向对象的方法,那么你的内存消耗将会非常少。因为每个对象都有自己的范围,超出范围就会被销毁。

0

已用内存的大小取决于尺寸和颜色位深度。 几年前,我也遇到过这个问题,同时为摄影师建立了一个投资组合网站。正确解决这个问题的唯一方法就是将图像库从GD切换到想象。 Imagick消耗的内存少得多,并且不受PHP内存限制的限制。我不得不说,摄影师上传的图像高达30MP。将内存限制设置为1024MB以上是没有意义的。