没有足够的内存在PHP中分配

时间:2014-01-15 10:05:47

标签: php

背景:

我有一个图像大小调整脚本,它采用上传的图像并将它们调整为指定的大小。(100x 100和250x250)但是,我有一个图像不断导致错误

PHP Fatal error:  Allowed memory size of 67108864 bytes exhausted (tried to allocate 21600 bytes) in .....

在我完成一些环顾之后,我发现这个特定图像(并没有其他人)导致错误的原因可能是由于它的尺寸。(5400 * 7200)在进一步环顾SO之后,我来了通过将php.ini中的内存大小增加到64MB来解决此问题。

然而,从PHP GD Allowed memory size exhausted开始,图像处理所需的内存量似乎来自(宽度*高度* 8),这将给出(5400 * 7200 * 8 = 311040000)。我的php ini文件然后说

Maximum amount of memory a script may consume (128MB)

远远小于300 + mb区域所需的311040000的数量?如果是这样,我有什么办法可以解决这个问题吗?

我目前正在使用localhost。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果你在apache webserver下工作,你可以在你的.htaccess文件中写下以下内容

<IfModule mod_php5.c>

    php_value memory_limit 512M

</IfModule>

这应该可以解决问题。

答案 1 :(得分:0)

您可以将PHP设置为根据需要使用尽可能多的内存(甚至是系统内存耗尽),但将限制设置为“0” - 但在Apache中运行的任何内容中都可以这样做,如mod_php(或者,就此而言fastCgi,fpm)是一个非常坏主意。原因是Apache进程将膨胀到它所占用的最大尺寸,通常会使系统长期放慢占用内存,直到它被销毁 - 这可能是几天或更长时间。

 php_value memory_limit -1

PHP的命令行版本通常没有设置限制,因此非常适合大型任务。

如果您要调整大图像的大小(目前使用可拍照手机,几乎都是所有照片),从命令行运行Apache转换会好得多。你可能甚至不需要PHP和GD来做到这一点。我之前完成此操作的一种方法是使用各种作业队列 - 最简单的是一个数据库表,其中包含要调整大小的文件列表,命令行进程一次一个地进行,并且它也可以在之后重新启动每个完成的图像 - 确保使用的所有内存都被清除。

相关问题