致命错误:允许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以上毫无意义。