PHP重建图像:内存使用


PHP rebuilding images: memory usage

致命错误:允许33554432字节的内存大小在/var/development/example/system/librarys/Image.php中耗尽(试图分配4912字节(,位于130行

所讨论的JPEG图像没有特别大的文件大小(741KB(。我们使用了相同的代码来重建更大的图像。然而,这张图片的尺寸确实非常大(4912px x 3264px(。这会有效果吗?

PHP重建图像时,内存使用情况由什么决定?只是文件大小吗?尺寸?颜色密度?文件类型

它断裂的线路是

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

我认为这已经足够了。它并没有试图重建图像。将其加载到内存中足以破坏它。

正如riky所说,如果可以的话,将内存限制设置得更高。还要意识到,尺寸比文件大小更重要(因为文件大小用于压缩图像(。当你在GD中打开一个图像时,每个像素都会分配3-4个字节,RGB,可能还有A。因此,你的4912px x 3264px图像需要使用48098304到64131072字节的内存,此外还有开销和脚本正在使用的任何其他内存。

增加内存缓冲区大小

.haccess 中的php_value memory_limit 64M

或php文件中的ini_set('memory_limit','64M');

这取决于您的实现。上一次,当我处理超过500000条记录的csv文件时,我收到了同样的消息。稍后我将介绍类,并尝试关闭打开的对象。它减少了它的记忆消费。如果你正在打开一个图像并对其进行编辑,这意味着它正在加载到内存中。在这种情况下,尺寸真的很重要。如果您正在操作多个图像。我将记录到每个图像一个,然后关闭该图像。根据我的经验,当时我正在处理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

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

所用内存的大小取决于维度和颜色位深度。几年前,我在为摄影师建立作品集网站时也遇到了这个问题。正确解决这个问题的唯一方法是将图像库从GD切换到imagick。Imagick消耗的内存要少得多,而且不受PHP内存限制。

我不得不说,摄影师上传的图片高达3000万张。在我看来,将内存限制设置为1024MB以上毫无意义。